大家好,我是被白菜拱的白菜。
技术:SSM框架,拦截器,过滤器
背景:在我们为实现登录或者注册的时候,当我们访问项目的其余页面时是不能要求访问的,有两种实现方式,一是用filter过滤,而是用interceptor拦截
登录页面:
注册页面:
Intercepter具体实现:
1.首先在spring-servlet.xml配置拦截器的具体内容
`
如果有多个拦截器满足拦截处理的要求,则依据配置的先后顺序来执行
-->
<mvc:interceptors>
<mvc:interceptor>
<!-- 拦截所有的请求,这个必须写在前面,也就是写在【不拦截】的上面 -->
<mvc:mapping path="/**" />
<!-- 但是排除下面这些,也就是不拦截请求 -->
<mvc:exclude-mapping path="/login.jsp" />
<mvc:exclude-mapping path="/users/login.do" />
<mvc:exclude-mapping path="/users/register.do" />
<bean class="com.bzbs.interceptor.LoginInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
2.创建类实现HandlerInterceptor接口
在postHandle()方法中写具体的业务需求,页面被拦截的之后需要做什么
public class LoginInterceptor implements HandlerInterceptor{
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
// TODO Auto-generated method stub
}
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
// TODO Auto-generated method stub
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
//获取session 判断里面是否存有用户信心,没有则返回登录页面
HttpSession session=request.getSession();
Object user =session.getAttribute("user");
Object password =session.getAttribute("password");
if(user==null || password==null){
String url = request.getRequestURL().toString();
response.sendRedirect(request.getContextPath()+"/system/login.jsp?returnURL="+url);
return false;
}
return true;
}
}
我这里是判断是否登录,假如已经登录了,就可以直接访问被拦截的页面,session里面没有值则继续放回等会页面,后面拼接原先要访问的地址,登录过后可以直接访问,使得我们访问页面方便了许多。
下面是filter实现:
1.配置web.xml内容
<filter>
<filter-name>loginFilter</filter-name>
<filter-class>com.bzbs.filter.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>loginFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
url-pattern为要过滤的页面,/*代表所有页面都要拦截,此处可以配置白名单与黑名单,具体怎么操作这里不再叙述
2.创建类实现Filter接口
/**
* @ClassName: LoginFilter
* @Description: 用拦截器没有作用,改变思路,用过滤器实现登录验证,假如没有登录则返回登录页面
* @author Lily
* @date 2020年3月11日
*/
public class LoginFilter implements Filter{
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
//首先获取http对象
HttpServletRequest request=(HttpServletRequest)req;
HttpServletResponse response=(HttpServletResponse)res;
//此处判断,先获得请求路径,然后对请求路径进行分析
/*
*
* request.getRequestURL() 返回全路径
request.getRequestURI() 返回除去host(域名或者ip)部分的路径
request.getContextPath() 返回工程名部分,如果工程映射为/,此处返回则为空
request.getServletPath() 返回除去host和工程名部分的路径
*/
String uri=request.getRequestURI();
/*首先对于登录页面我们是可以直接进行访问的,假如没有登录,则判断是否已经登录,即session
是否有值,没有值则不允许访问
*/
if(!uri.endsWith("register.do")&&!uri.endsWith("login.jsp")&&!uri.endsWith("login.do")&&
!uri.endsWith(request.getContextPath()) && !uri.endsWith(request.getContextPath() + "/")){
//下一步想要访问非登录页面,则判断session是否有值
Object loginUser=request.getSession().getAttribute("user");
if(loginUser!=null){
//让他访问
chain.doFilter(req, res);
}else{
//不满足条件,则返回登录页面
String url = request.getRequestURL().toString();
response.sendRedirect(request.getContextPath() + "/system/login.jsp?returnURL=" + url);
}
}else{
chain.doFilter(req, res);
}
}
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
chain.doFilter就是代表请求通过,这里我为了图方便没有配置白名单,直接用了if判断。