定义filter对session过期用户重新登录

一、在web.xml中自定义securityFilter,设置跳转页面、需过滤的url相关参数

	<filter>
		<filter-name>securityFilter</filter-name>
		<filter-class>com.sasis.webapp.filter.UserFilter</filter-class>
		<init-param>
			<param-name>errorPath</param-name>
			<param-value>./nouUserSession.jsp</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>securityFilter</filter-name>
		<url-pattern>*.html</url-pattern>
	</filter-mapping>
	<filter-mapping>
		<filter-name>securityFilter</filter-name>
		<url-pattern>*.shtml</url-pattern>
	</filter-mapping>

二、UserFilter.java处理session过期用户跳转逻辑

package com.sasis.webapp.filter;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import uk.ltd.getahead.dwr.WebContextFactory;

import com.sasis.Constants;
import com.sasis.model.CurrentUser;
import com.sasis.model.User;

public class UserFilter implements Filter {
	private static final Log log = LogFactory.getLog(UserFilter.class);
	private String errorUrl;

	public void init(FilterConfig filterConfig) throws ServletException {
		errorUrl = filterConfig.getInitParameter("errorPath");
		log.debug("--------------------------errorUrl______");
		log.debug(errorUrl);
		log.debug("--------------------------errorUrl______");
	}

	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain filterChain) throws IOException, ServletException {
		try {
			HttpServletRequest httpRequest = (HttpServletRequest) request;
			HttpServletResponse httpResponse = (HttpServletResponse) response;
			HttpSession session = httpRequest.getSession();
			User user = (User)session.getAttribute("user");
			log.debug(">>>>>>>>>>>>user>>>>>>>>>>>>"+user);
			//if(null!=user)CurrentUser.set((User)session.getAttribute("user"));
			CurrentUser.set(user);
            String isLogin = (String) session.getAttribute(Constants.CURUSER_KEY);
            
            boolean UrlNotvalidated = false;
			String resourceURL = httpRequest.getRequestURL().toString(); 
			String queryString = httpRequest.getQueryString(); 
			String[] actionStrArray = resourceURL.split("/");
			//if ("activityChangeMsg.html".equalsIgnoreCase(actionStrArray[actionStrArray.length -1])){
				UrlNotvalidated = true;
			//}
            String referer = httpRequest.getHeader("referer");
            
            if (null != referer || UrlNotvalidated){
              
    			if (session == null || !"true".equals(isLogin)) {
//    				System.out.println(request.getParameter("method"));
    				if(null != request.getParameter("method") && request.getParameter("method").startsWith("psg")){
    					filterChain.doFilter(request, response);
    				}else{
    					httpRequest.setAttribute("notUserSession","Y");
        				httpResponse.sendRedirect(errorUrl);
    				}
    				
    			} else {
   				filterChain.doFilter(request, response);
   			}
            } else {
				httpResponse.sendRedirect(errorUrl);
            }
		} catch (Exception ex) {
			log.error(ex);
			ex.printStackTrace();
		}
	}
	public void destroy() {

	}

}


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个简单的实现基于Spring Security的单点登录的配置类示例: ```java @Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private CustomUserDetailsService userDetailsService; @Autowired private JwtAuthenticationEntryPoint unauthorizedHandler; @Autowired private JwtTokenProvider jwtTokenProvider; @Value("${jwt.header}") private String jwtHeader; @Value("${jwt.prefix}") private String jwtPrefix; @Value("${jwt.secret}") private String jwtSecret; @Value("${jwt.expiration}") private long jwtExpiration; @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } @Bean public JwtAuthenticationFilter jwtAuthenticationFilter() { return new JwtAuthenticationFilter(jwtTokenProvider, userDetailsService, jwtHeader, jwtPrefix); } @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder()); } @Override protected void configure(HttpSecurity http) throws Exception { http .cors().and().csrf().disable() .exceptionHandling().authenticationEntryPoint(unauthorizedHandler).and() .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and() .authorizeRequests() .antMatchers("/api/auth/**").permitAll() .anyRequest().authenticated().and() .addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class); } @Bean public JwtTokenProvider jwtTokenProvider() { return new JwtTokenProvider(jwtSecret, jwtExpiration); } @Bean public SingleSignOutFilter singleSignOutFilter() { SingleSignOutFilter filter = new SingleSignOutFilter(); filter.setCasServerUrlPrefix("https://localhost:8443/cas"); filter.setIgnoreInitConfiguration(true); return filter; } @Bean public CasAuthenticationFilter casAuthenticationFilter(ServiceProperties serviceProperties) throws Exception { CasAuthenticationFilter filter = new CasAuthenticationFilter(); filter.setServiceProperties(serviceProperties); filter.setAuthenticationManager(authenticationManager()); return filter; } @Bean public ServiceProperties serviceProperties() { ServiceProperties serviceProperties = new ServiceProperties(); serviceProperties.setService("https://localhost:8444/login/cas"); serviceProperties.setSendRenew(false); return serviceProperties; } @Bean public CasAuthenticationProvider casAuthenticationProvider() { CasAuthenticationProvider provider = new CasAuthenticationProvider(); provider.setAuthenticationUserDetailsService(new UserDetailsServiceImpl()); provider.setServiceProperties(serviceProperties()); provider.setTicketValidator(cas20ServiceTicketValidator()); provider.setKey("casAuthProviderKey"); return provider; } @Bean public Cas20ServiceTicketValidator cas20ServiceTicketValidator() { return new Cas20ServiceTicketValidator("https://localhost:8443/cas"); } @Bean public SingleLogoutFilter singleLogoutFilter() { LogoutFilter filter = new LogoutFilter("https://localhost:8443/cas/logout", new SecurityContextLogoutHandler()); filter.setFilterProcessesUrl("/logout/cas"); return filter; } @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.authenticationProvider(casAuthenticationProvider()); } @Override public void configure(WebSecurity web) throws Exception { web.ignoring().antMatchers("/resources/**"); } @Override protected void configure(HttpSecurity http) throws Exception { http .addFilter(singleSignOutFilter()) .addFilterBefore(casAuthenticationFilter(serviceProperties()), BasicAuthenticationFilter.class) .addFilterBefore(singleLogoutFilter(), CasAuthenticationFilter.class); } } ``` 在上述代码,我们定义了一个`SecurityConfig`配置类,并在其实现了单点登录的功能。具体的步骤如下: 1. 配置JWT Token的生成和验证。我们使用了`JwtTokenProvider`类来生成和验证JWT Token,其的`jwtSecret`和`jwtExpiration`参数分别表示JWT Token的秘钥和过期时间。 2. 配置JWT Token的过滤器。我们使用了`JwtAuthenticationFilter`类来实现JWT Token的过滤和校验,其的`jwtHeader`和`jwtPrefix`参数用于指定JWT Token在请求头的名称和前缀。 3. 配置CAS单点登录相关的过滤器。我们使用了`SingleSignOutFilter`、`CasAuthenticationFilter`和`LogoutFilter`三个过滤器来实现CAS单点登录的功能。其的`casServerUrlPrefix`和`serviceProperties`参数分别表示CAS服务器的地址和客户端的服务配置。 4. 配置CAS单点登录的认证和授权。我们使用了`CasAuthenticationProvider`和`UserDetailsServiceImpl`两个类来实现CAS的认证和授权功能。 5. 配置Spring Security的授权规则和安全配置。我们使用了`HttpSecurity`类来配置Spring Security的授权规则和安全配置,其的`permitAll()`表示对外开放的API接口,而`authenticated()`表示需要认证后才能访问的接口。 通过上述配置,我们就可以实现基于Spring Security的单点登录功能了。具体的实现过程和细节可以根据实际需求进行调整和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值