【发布时间】:2017-09-22 07:33:54
【问题描述】:
我想在会话超时时做一些活动,我使用了看起来像这样的 HandlerInterceptorAdapter
package com.practice.security;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
public class SessionHandelerInterceptor extends HandlerInterceptorAdapter{
private static final long MAX_INACTIVE_SESSION_TIME = 5 * 10000;
@Autowired
private HttpSession session;
@Override
public boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) throws Exception {
//long startTime = System.currentTimeMillis();
//request.setAttribute("executionTime", startTime);
if (this.isUserLogged()) {
session = request.getSession();
if (System.currentTimeMillis() - session.getLastAccessedTime()
> MAX_INACTIVE_SESSION_TIME) {
//Do some more activity
SecurityContextHolder.clearContext();
request.logout();
response.sendRedirect("/userLogin/logout");
}
}
return true;
}
private boolean isUserLogged(){
try {
return !SecurityContextHolder.getContext().getAuthentication()
.getName().equals("anonymousUser");
} catch (Exception e) {
return false;
}
}
}
问题是当请求到达拦截器的 preHandle 方法时,会话的 lastAccessTime 被更新为当前时间。 我认为原因是在去预处理方法之前,每个请求都去我的自定义 UsernamePasswordAuthenticationFilter 的 doget 方法。我还在我的应用程序中使用了 Spring 安全性。
import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.authority.AuthorityUtils;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
import org.springframework.web.context.support.WebApplicationContextUtils;
import com.practice.AppConstant;
public class AuthenticationTokenFilter extends UsernamePasswordAuthenticationFilter {
private Tokenutils tokenUtils;
//@Autowired
//private UserDetailsService userDetailService;
@Override
public void doFilter(ServletRequest request , ServletResponse res , FilterChain chain) throws IOException , ServletException{
tokenUtils=(Tokenutils) WebApplicationContextUtils.getRequiredWebApplicationContext(this.getServletContext()).getBean(Tokenutils.class);
//userDetailService=WebApplicationContextUtils.getRequiredWebApplicationContext(this.getServletContext()).getBean(UserDetailsService.class);
HttpServletResponse response = (HttpServletResponse) res;
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
//response.setHeader("Access-Control-Allow-Headers", "x-requested-with");
response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type,"+AppConstant.tokenHeader);
HttpServletRequest httpRequest = (HttpServletRequest)request;
//String authToken=httpRequest.getHeader(AppConstant.tokenHeader);
String authToken=httpRequest.getParameter("XAuthToken");
String userName=this.tokenUtils.getUsernameFromToken(authToken);
if(userName!=null && SecurityContextHolder.getContext().getAuthentication()==null){
//UserDetails userDetails= this.userDetailService.loadUserByUsername(userName);
UserDetails userDetails=new SpringSecurityUser(1L, userName, null, null, null, AuthorityUtils.commaSeparatedStringToAuthorityList(""));
if(this.tokenUtils.validateToken(authToken,userDetails)){
UsernamePasswordAuthenticationToken authentication= new UsernamePasswordAuthenticationToken(userDetails, null,userDetails.getAuthorities());
authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(httpRequest));
SecurityContextHolder.getContext().setAuthentication(authentication);
}
}
chain.doFilter(request, res);
}
}
任何帮助将不胜感激谢谢。
【问题讨论】:
标签: java spring spring-mvc session