如何避免Spring项目中映射的重复代码?

hon*_*lop 2 java spring spring-mvc

我目前映射使用的页面Page Controller

每个页面都需要检查Session,这是一个重复的代码

如何避免重复此代码?

@Controller
public class PageController {
...
    @RequestMapping("/view/List")
    public String list(Map<String, Object> model) {
        String session_chk = Utils.SessionCheck(); 
        if(session_chk.equals("none")){
            return "/view/manager/Login";
        }

        return "/view/member/List";
    }

    @RequestMapping("/view/Detail")
    public String detail(Map<String, Object> model) {
        String session_chk = Utils.SessionCheck();
        if(session_chk.equals("none")){
            return "/view/manager/Login";
        }

        return "/view/member/Detail";
    }
...
Run Code Online (Sandbox Code Playgroud)

Edu*_*iek 6

您可以使用 Spring Security 来避免与保护您的 Web 应用程序相关的所有重复代码,并且它还提供内置保护,以防止会话固定点击劫持跨站点请求伪造等攻击。它是保护基于 Spring 的应用程序的事实上的标准。

在这里你可以找到一系列不错的教程来学习Spring Security

在这里您可以找到一个小示例,您将在其中看到我如何仅使用Spring Security配置处理与您类似的情况。

示例运行

这是我的Spring Security配置类

@Configuration
@EnableWebSecurity
public class SecSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(final AuthenticationManagerBuilder auth) throws Exception {    
        auth.inMemoryAuthentication()
                .withUser("user1").password(passwordEncoder().encode("user1Pass")).roles("USER")
                .and()
                .withUser("user2").password(passwordEncoder().encode("user2Pass")).roles("USER")
                .and()
                .withUser("admin").password(passwordEncoder().encode("adminPass")).roles("ADMIN");      
    }

    @Override
    protected void configure(final HttpSecurity http) throws Exception {     
        http
                .csrf().disable()
                .authorizeRequests()
                // Only users with admin role will access views starting with /admin
                .antMatchers("/admin/**").hasRole("ADMIN")
               //  Anonymous users (users without sessions) will access this URL
                .antMatchers("/anonymous*").anonymous()
               // Allowing all users to access login page
                .antMatchers("/login*").permitAll()
                .anyRequest().authenticated()
                .and()
                .formLogin()
                .loginPage("/login.html")
                .loginProcessingUrl("/perform_login")
                .defaultSuccessUrl("/homepage.html", true)              
                .failureHandler(authenticationFailureHandler())
                .and()
                .logout()
                .logoutUrl("/perform_logout")
                .deleteCookies("JSESSIONID")
                .logoutSuccessHandler(logoutSuccessHandler())
                .and()
                .exceptionHandling().accessDeniedPage("/accessDenied");     
    }

    @Bean
    public LogoutSuccessHandler logoutSuccessHandler() {
        return new CustomLogoutSuccessHandler();
    }

    @Bean
    public AuthenticationFailureHandler authenticationFailureHandler() {
        return new CustomAuthenticationFailureHandler();
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}
Run Code Online (Sandbox Code Playgroud)