如果不想将冗长的逻辑处理给到框架内部处理,或者不想使用原生处理,可以试用spring-intercepter进行请求捕捉,然后自定义Filter进行处理。
这样的好处是,整个逻辑看起来很立体,可以满足自己特定的业务需求,摸清了框架内部的套路,再也不是将相应的请求扔到内部,而自己只是写一堆正则表达式就完事了。
在springmvc中定义:
<!-- 自定义普通用户拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<!-- 不需要拦截的请求 -->
<mvc:exclude-mapping path="/login"/>
<!-- 自定义Filter -->
<bean class="org.liao.filter.AutoLoginFilter" />
</mvc:interceptor>
</mvc:interceptors>
在自定义Filter中实现HandlerInterceptor,然后重写相关的方法,在preHandle()中编写相应的逻辑代码。
类似:
public class ManageLoginFilter implements HandlerInterceptor {
@Resource
private UserService userService;
public void afterCompletion(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse,
Object o, Exception e) throws Exception {
}
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object o) throws Exception {
Cookie[] cookies = request.getCookies();
int isAuto = -1;
User temp = new User();
for (Cookie c:cookies) {
if (c.getName().equals("autoLoginUser")) {
temp = userService.findByUserName(c.getValue());
isAuto = 1;
}
}
System.out.println(isAuto+","+temp.getIsAdmin());
if (isAuto == -1 || temp.getIsAdmin() != 1) {
//请用管理员用户重新登录
//退出到登录页面
response.sendRedirect(request.getContextPath()+"/login");
return false;
}
for (Cookie c:cookies) {
if (c.getName().equals("sessionId")) {
if (!c.getValue().equals(temp.getSessionId())) {
//退出到登录页面
response.sendRedirect(request.getContextPath()+"/login");
return false;
}
}
}
return true;
}
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
}
}
网友评论