zoukankan      html  css  js  c++  java
  • Online Judge(OJ)搭建——5、配置

    Spring

    配置一些本地类,还有 HTML form 提交文件的解析器。

    package per.piers.onlineJudge.config;
    
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
    
    import javax.servlet.MultipartConfigElement;
    import javax.servlet.ServletRegistration;
    
    @Configuration
    public class WebApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    
        @Override
        protected Class<?>[] getRootConfigClasses() {
            return new Class<?>[]{RootConfig.class, SecurityConfig.class};
        }
    
        @Override
        protected Class<?>[] getServletConfigClasses() {
            return new Class<?>[]{WebConfig.class};
        }
    
        @Override
        protected String[] getServletMappings() {
            return new String[]{"/"};
        }
    
        @Override
        protected void customizeRegistration(ServletRegistration.Dynamic registration) {
            registration.setMultipartConfig(new MultipartConfigElement(""));
        }
    
    }

    Spring Security

    Spring 需要从数据库获取权限相关数据,所以需要配置数据源。之后根据相关用户身份,配置访问的权限。

    package per.piers.onlineJudge.config;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
    import org.springframework.security.config.annotation.web.builders.HttpSecurity;
    import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
    import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
    
    import javax.sql.DataSource;
    
    @Configuration
    @EnableWebSecurity
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
    
        private DataSource dataSource;
    
        @Autowired
        public SecurityConfig(DataSource dataSource) {
            this.dataSource = dataSource;
        }
    
        @Override
        protected void configure(AuthenticationManagerBuilder auth) throws Exception {
            auth
                    .jdbcAuthentication().dataSource(dataSource)
                    .usersByUsernameQuery("SELECT email, password, enabled FROM users WHERE email=?")                                                                        // password
                    .authoritiesByUsernameQuery("SELECT email, role FROM users WHERE email=?");
        }
    
        @Override
        protected void configure(HttpSecurity httpSecurity) throws Exception {
            httpSecurity
                    .authorizeRequests()
                    // user
                    .regexMatchers("/user/information").hasAnyAuthority("user","admin")
                    // test
                    .regexMatchers("/test/question/\d+").hasAnyAuthority("user","admin")
                    // score
                    .regexMatchers("/score/.+").hasAnyAuthority("user","admin")
                    // testManager
                    .regexMatchers("/testManager/.+").hasAnyAuthority("admin")
                    // others
                    .anyRequest().permitAll().and() // set authorization matcher
                    .formLogin().loginPage("/user/login").defaultSuccessUrl("/user/information").and()
                    .rememberMe().tokenValiditySeconds(604800).key("OnlineJudge").and()
                    .logout().logoutUrl("/user/logout").logoutSuccessUrl("/user/login");
        }
    
    }

    由于 Spring Security 的默认编码是 ISO-8850-1,所以需要配置 CharacterEncodingFilter 把默认编码变更为 UTF-8。

    package per.piers.onlineJudge.config;
    
    import org.springframework.context.annotation.Configuration;
    import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer;
    import org.springframework.web.filter.CharacterEncodingFilter;
    
    import javax.servlet.FilterRegistration;
    import javax.servlet.ServletContext;
    
    @Configuration
    public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer {
    
        @Override
        protected void beforeSpringSecurityFilterChain(ServletContext servletContext) {
            FilterRegistration.Dynamic characterEncodingFilter = servletContext.addFilter("encodingFilter", new CharacterEncodingFilter());
            characterEncodingFilter.setInitParameter("encoding", "UTF-8");
            characterEncodingFilter.setInitParameter("forceEncoding", "true");
            characterEncodingFilter.addMappingForUrlPatterns(null, false, "/*");
        }
    
    }

    MyBatis

    Online Judge(OJ)搭建——2、数据库,SQL语句介绍过。

    数据源

    JNDI

    在程序中,将数据源托管给专人负责,此为 JNDI 方式。这里托管给 Tomcat 负责,在OnlineJudge/WEB-INF/META-INF/context.xml配置。这种方式将程序和数据库链接解耦,推荐。

    <?xml version="1.0" encoding="UTF-8"?>
    <Context>
        <Resource name="mybatis"
                  auth="Container"
                  type="javax.sql.DataSource"
                  driverClassName="com.mysql.cj.jdbc.Driver"
                  url="jdbc:mysql://localhost:3306/online_judge?serverTimezone=UTC&amp;useUnicode=true&amp;characterEncoding=UTF-8&amp;useSSL=true"
                  username="root"
                  password="woaimysql-135"
                  maxTotal="20"
                  maxIdle="10"
                  maxWaitMillis="10000"/>
    </Context>
  • 相关阅读:
    springmvc入门详解
    getClass 与getSimpleName
    mybati的存储过程
    mybatis与spring的整合
    mybatis分页插件以及懒加载
    mybatis知识总结
    【Java面试题】30 子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序。
    【Java面试题】29 设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。
    【Java面试题】28 简述synchronized和java.util.concurrent.locks.Lock的异同 ?
    【Java面试题】27 多线程笔试面试概念问答
  • 原文地址:https://www.cnblogs.com/Piers/p/6947103.html
Copyright © 2011-2022 走看看