1.配置拦截器
<mvc:interceptors>
<bean class="com.dy.admin.interceptor.AdminLoginHandlerInterceptor"/>
</mvc:interceptors>
2.创建登陆判断拦截器的实现类
public class LoginHandlerInterceptor extends HandlerInterceptorAdapter{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String path = request.getServletPath();
if ("/".equals(path))
return true;
if (path.matches(".*/((assets)|(js)|(images)|(common)|(public)).*"))
return true;
for (String newPath : list) {
if (path.matches(newPath)) {
return true;
}
}
if (request.getSession().getAttribute(Constant.SESSION_USER) == null) {
System.out.println("---------------");
response.sendRedirect(request.getContextPath() + Constant.LOGIN_URL);
return false;
}
return true;
}
/**
* 免拦截的url
*/
public static List<String> list = new ArrayList<String>();
static {
//备案平台管理
list.add("****");
}
}
3.权限控制
public class AdminLoginHandlerInterceptor extends LoginHandlerInterceptor {
@Autowired
private BaseService baseService;
@Override
@SuppressWarnings("unchecked")
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
//用来控制权限
super.postHandle(request, response, handler, modelAndView);
}
}
总结遇到的需要强势记住的:
1.需要实现HandlerInterceptorAdapter接口的方法:
preHandle:在调用controller之前调用
postHandle:preHandle返回为true时执行,为false该拦截链直接结束,在调用controller之后调用,在 DispatcherServlet之前 调用,可以对ModleAndView进行操作。
afterCompletion:在postHandle返回为true时调用,用来释放资源。
2.request的路径问题
摘自:https://blog.csdn.net/qq_27770257/article/details/79438987
1. getServletPath():获取能够与“url-pattern”中匹配的路径,注意是完全匹配的部分,*的部分不包括。
2. getPageInfo():与getServletPath()获取的路径互补,能够得到的是“url-pattern”中*d的路径部分
3. getContextPath():获取项目的根路径
4. getRequestURI:获取根路径到地址结尾
5. getRequestURL:获取请求的地址链接(浏览器中输入的地址)
6. getServletContext().getRealPath(“/”):获取“/”在机器中的实际地址
7. getScheme():获取的是使用的协议(http 或https)
8. getProtocol():获取的是协议的名称(HTTP/1.11)
9. getServerName():获取的是域名(xxx.com)
10. getLocalName:获取到的是IP