一、背景
最近在一个springmvc+mtbatis项目中配置自定义拦截器时发现了一些问题,主要就是由<mvc:annotation-driven />这狗比引起的,害的我找了好久,再加上网上各种抄袭博客内容相同,真正解决问题的很少,所以记录下来,以供各位尽早出坑。
二、解决方案
1.如果没有使用<mvc:annotation-driven />,直接使用常规自定义拦截器即可,当然,如果这样你也没必要看我博客。
自定义拦截器方法如下:
<!-- 定义拦截器 -->
<mvc:interceptors>
<!-- 在此声明拦截器位置,此处为公共拦截类 -->
<!-- <bean class="cn.edu.tit.interceptor.CsrfInterceptor"/>
<bean class="cn.edu.tit.interceptor.LoginInterceptor"/> -->
<mvc:interceptor>
<!-- 对登陆进行csrf攻击拦截 -->
<mvc:mapping path="/teacher/teacherLogin" />
<bean class="cn.edu.tit.interceptor.CsrfInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
2.如果可以自己配置<mvc:annotation-driven />,而不使用该配置,也是可以的,具体请看这位大神的博客,我感觉写的很好。
博客地址:https://www.cnblogs.com/yangzhilong/p/3725849.html;
3.如果你即想使用<mvc:annotation-driven />,又想使用自定义拦截器(如方法1),那么在自定义拦截器的时候只需要实现(implements)HandlerInterceptor这个接口,接口包属于(org.springframework.web.servlet.HandlerInterceptor),当然也是笔者也是这种办法搞定的,简介明了。
以下代码为我写的未登录点击链接拦截到登录页面的代码,因为只是演示拦截器冲突问题,就不再进行注释,如需解释,请联系我。
package cn.edu.tit.interceptor;
import java.io.PrintWriter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.AbstractHandlerMethodMapping;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import com.fasterxml.jackson.databind.cfg.HandlerInstantiator;
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
HttpSession session = request.getSession();
Object obj = session.getAttribute("teacherId"); // 当前teacherid
// 判断点击的uri是否和登录页面有关,进行筛选
String[] noFilters = new String[] { "login", "Login" }; // url中如果有"login"和"handle"不拦截
String uri = request.getRequestURI();
boolean beFilter = true;//判断是否需要拦截,true拦截
if (uri.indexOf("mooc") != -1) { //判断链接是否为登录相关页面
for (String s : noFilters) {
if (uri.indexOf(s) != -1) {
beFilter = false;
break;
}
}
}
// 进行有野登录权限拦截
if (beFilter) {
if (null == obj) {
// 未登录
PrintWriter out = response.getWriter();
StringBuilder builder = new StringBuilder();
builder.append("<script type=\"text/javascript\" charset=\"UTF-8\">");
builder.append("alert(\"页面过期,请重新登录\");");
builder.append(
"window.location.href=\"http://localhost:8080/spoc-mooc/jsp/Teacher/index.jsp\";</script>");
// builder.append("spoc-mooc"); //这里是http://ip:port/项目名
// builder.append("/jsp/Teacher/index.jsp\";</script>"); //这里是重新登录的页面url
out.print(builder.toString());
out.close();
return false;
}
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// TODO Auto-generated method stub
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
}
/**
* This implementation always returns {@code true}.
* @author wenli
* service之前执行
*
*/
}