因为浏览器的url是可以让人任意输入网址进行访问的,在一个项目中,我们不可能让用户不进行操作就能利用url直接访问系统,因此这篇文章主要讲如何避免这个问题。
首先,解决上述的问题,我们利用拦截器技术就可以解决。
在进行实验之前,我们首先要知道拦截器与过滤器的区别是什么?先啰嗦一下
在我们需要对用户的某个请求进行干预,而这种干预称为拦截,是通过拦截器拦截的!
而过滤器是用来过滤网站某些资源的,是不经过用户请求的。比如说我们的项目都要进行编码过滤器,因为我们在项目中用的是中文或者其他除英文外的文字,不进行编码过滤是会造成乱码的。而这个过滤是不经用户操作的,因此称为过滤器,而不是拦截器。
(以上感觉说的不尽是全对,意思上类似)
好了,现在开始实验!
1.在包中添加一个拦截器类LoginInterceptor
(不清楚我项目结构和内容的可以在我这系列上一篇的文章可以看到)
LoginInterceptor类:
这个类重写org.springframework.web.servlet.HandlerInterceptor的接口方法;
preHandle()方法是在用户访问前做什么,因此我们在用户不登录系统进行系统内部操作前进行拦截!
1.我们通过httpServletRequest.getRequestURI();获取当前的url地址。
2.我们进行拦截的是包含login(大写Login通过toLowerCase方法变成全部字母为小写)的url,如果当前的url跟login有关,则不进行拦截,返回true。
3.在处理登录的Controller的方法里,如果用户登录成功,我们使用Httpsession添加参数为“user”并添加值。(这个可以在我这系列上一篇的文章web层的LoginController文件中的login()方法可以看到)
4.回到这个类,如果用户已经登录过了,服务器里有其session值,如果其进行系统内部操作这种情况我们要放行!因此在此类中我们获取session中的user的值,检查其是否为空,如果其存在,则放行!
5.如果用户没登录又直接访问系统内部路由,则返回false,进行拦截!并重定向到路由/to_login。
package com.myhomes.global;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class LoginInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
String url = httpServletRequest.getRequestURI();
if(url.toLowerCase().indexOf("login")>=0){
return true;
}
HttpSession session = httpServletRequest.getSession();
if(session.getAttribute("user")!=null){
return true;
}
httpServletResponse.sendRedirect("/to_login");
return false;
}
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
}
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
}
}
xml文件配置拦截器
启动tomcat并进行操作
这里是控制器路由,有多个路由方法。
1.先未登录,在url直接访问登录后的self路由成功拦截的话会回到to_login路由(因为我成功了网页直接跳转回登录界面理由,就没有放图)
2.成功登录后不进行退出系统操作,返回登录界面后继续访问访问登录后的self路由,如果成功就完成了拦截!