以下是实现未登录不能进入页面的实现
使用了thyemeleaf+SpringBoot+过滤器实现的,过滤器的核心代码如下:
@Component
@WebFilter(filterName = "TestFilter",urlPatterns = "/*")
@Order(1) //Order(1)在定义多个Filter时,用于决定执行顺序的,数字越小,越先执行。
public class TestFilter implements Filter {
private static final Set<String> ALLOWED_PATHS = Collections.unmodifiableSet(new HashSet<>(
Arrays.asList("/index", "/login")));
@Override
public void init(FilterConfig filterConfig) throws ServletException { } @Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
// //这样在每个Servlet执行的时候都会先进行这个
HttpServletRequest request= (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
System.out.println("过滤器实现");
if(needLogin(request)) {
// 需要登录则跳转到登录Controller
String userName = (String)((HttpServletRequest) request).getSession().getAttribute("userName");
System.out.println("userName="+userName);
System.out.println(Optional.ofNullable(userName).map(String::length).orElse(0));
if(Optional.ofNullable(userName).map(String::length).orElse(0) <= 0){
response.sendRedirect("login");
// response.sendRedirect(request.getContextPath()+"/login");
}
filterChain.doFilter(servletRequest, servletResponse);
return;
}else{
}
//因为有可能不止这一个过滤器,所以需要将所有的过滤器执行
//注意 这一行代码一定要写到最后
filterChain.doFilter(servletRequest, servletResponse);
} @Override
public void destroy() { } private boolean needLogin(HttpServletRequest request) {
//进行是否需要登录的判断操作
String path = request.getRequestURI().substring(request.getContextPath().length()).replaceAll("[/]+$", "");
System.out.println(path);
boolean allowedPath = ALLOWED_PATHS.contains(path);
System.out.println(allowedPath);
return !allowedPath;
}
}

代码链接:

链接:https://pan.baidu.com/s/1Kvh4JWCM3aIpiaqK67Rw3g 密码:pa57

过滤器虽然也能实现,但是用起来会有个问题,假如说是我请求http://localhost:8080/usercenter,时,我期望的过程是,在过滤器里发现未登录,直接就跳转进入login,但是,实际山遇到的情况是,会先进入我的usercenter方法,跑过这个方法之后再进过滤器,再走login,这就会出现情况,假如说是我的usercenter方法(由于未登录导致出现方法中出现null的情况)有问题,导致最后页面报500

,为了解决这个问题,采用了拦截器,正好就是自己想要的效果,未登录的时候不进入usercenter,直接进入login

一下是拦截器代码:

拦截器的:

@Configuration
public class LoginInterceptor implements HandlerInterceptor {
@Override // 在执行目标方法之前执行
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("------:进来拦截器了!--1");
//获取session
HttpSession session = request.getSession(true);
//判断用户ID是否存在,不存在就跳转到登录界面
if(session.getAttribute("phoneNum") == null){
System.out.println("------:跳转到login页面!");
response.sendRedirect(request.getContextPath()+"/login");
return false;
}else{
session.setAttribute("phoneNum", session.getAttribute("phoneNum"));
return true;
}
} @Override // 执行目标方法之后执行
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("------:进来拦截器了!--2");
} @Override // 在请求已经返回之后执行
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("------:进来拦截器了!--3");
}
}

配置文件的:WebConfig.java的代码:

@Configuration
@EnableWebMvc
@ComponentScan
public class WebConfig extends WebMvcConfigurerAdapter implements ApplicationContextAware { private ApplicationContext applicationContext; public WebConfig(){
super();
} @Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**").addResourceLocations(ResourceUtils.CLASSPATH_URL_PREFIX+"/static/");
registry.addResourceHandler("/templates/**").addResourceLocations(ResourceUtils.CLASSPATH_URL_PREFIX+"/templates/");
super.addResourceHandlers(registry);
} @Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
//拦截规则:除了login,其他都拦截判断
registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**").excludePathPatterns("/index", "/login","register");
super.addInterceptors(registry);
} }

这样就能完美的解决过滤器时遇到的问题

结束

代码链接:链接:https://pan.baidu.com/s/1QusjeJ2EVo4K55xN_saooQ 密码:nh85

Java 过滤器实现(登录) + 拦截器(两种方法)的更多相关文章

  1. .NET MVC中登录过滤器拦截的两种方法

    今天给大家介绍两种ASP中过滤器拦截的两种方法. 一种是EF 的HtppModule,另一种则是灵活很多针对MVC的特性类 Attribute 具体什么是特性类可以参考着篇文章:https://www ...

  2. java 获取键盘输入常用的两种方法

    java 获取键盘输入常用的两种方法 方法1: 通过 Scanner Scanner input = new Scanner(System.in); String s = input.nextLine ...

  3. Java过滤器与SpringMVC拦截器的差异学习笔记

    学习摘录地址:http://blog.csdn.net/chenleixing/article/details/44573495 今天学习和认识了一下,过滤器和SpringMVC的拦截器的区别,学到了 ...

  4. java中调用dll文件的两种方法

    一中是用JNA方法,另外是用JNative方法,两种都是转载来的, JNA地址:http://blog.csdn.net/shendl/article/details/3589676   JNativ ...

  5. Java加载资源文件的两种方法

    处理配置文件对于Java程序员来说再常见不过了,不管是Servlet,Spring,抑或是Structs,都需要与配置文件打交道.Java将配置文件当作一种资源(resource)来处理,并且提供了两 ...

  6. Win7系统取消登录界面的两种方法(图文)

    windows7系统设置电脑密码后,即使取消密码,也会出现登录界面 ,每次都要点击用户图标才能进入系统,这样比较麻烦.那么有什么办法可以取消登录界面呢?方法当然是有的,阅读下文教程,我们一起来看下Wi ...

  7. flask 实现登录 登出 检查登录状态 的两种方法的总结

    这里我是根据两个项目的实际情况做的总结,方法一(来自项目一)的登录用的是用户名(字符串)和密码,前后端不分离,用form表单传递数据:方法二用的是手机号和密码登录,前后端分离,以json格式传递数据, ...

  8. java生成解析xml的另外两种方法JAXB

     JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术.该过程中,JAXB也提供了将XML实例文档反 ...

  9. java生成解析xml的另外两种方法Xstream

    Xstream生成和解析xm和JAXB生成和解析xml的方法. 一,Xstream Xstream非jdk自带的,需要到入Xstream-1.4.3.jar和xpp3_min-1.1.4.jar 1. ...

  10. Java数组实现循环队列的两种方法

    用java实现循环队列的方法: 1.添加一个属性size用来记录眼下的元素个数. 目的是当head=rear的时候.通过size=0还是size=数组长度.来区分队列为空,或者队列已满. 2.数组中仅 ...

随机推荐

  1. Normalize.css 与传统的 CSS Reset 有哪些区别?

    CSS Reset 是革命党,CSS Reset 里最激进那一派提倡不管你小子有用没用,通通给我脱了那身衣服,凭什么你 body 出生就穿一圈 margin,凭什么你姓 h 的比别人吃得胖,凭什么你 ...

  2. VC6.0 快捷键

    F1: 帮助 Ctrl+O   :OpenCtrl+P   :PrintCtrl+N   :NewCtrl+Shift+F2 :清除所有书签F2    :上一个书签Shift+F2 :上一个书签Alt ...

  3. SP8093 JZPGYZ - Sevenk Love Oimaster

    传送门 广义后缀自动机-- 其实也不是很难理解,就是每次SAM插入一个串之后,插入新的串的时候,要把last重新调到1的位置,共用一些节点. 这个题我们首先要预处理出来每个状态被多少个串共用.挺暴力的 ...

  4. Ubuntu12.04下安装、使用、卸载MySQL

    转自:http://blog.csdn.net/yimi0903/article/details/11800713 一.安装 Step1:安装MySQL-server,mysql-client 执行以 ...

  5. Tautonym Puzzle

    题意: 构造一个长度不超过200,数字不大于100的序列,使得合法子序列的个数恰好为N: 合法子序列是指一个长度为偶数的序列,前一半和后一半相等. 解法: 考虑这种构造方法 假设我们当前有序列为 $x ...

  6. hdu-2141

    Can you find it? Time Limit: 10000/3000 MS (Java/Others)    Memory Limit: 32768/10000 K (Java/Others ...

  7. java集合框架之几种set(HashSet LinkedHashSet TreeSet )

    参考http://how2j.cn/k/collection/collection-sets/691.html#nowhere HashSet LinkedHashSet TreeSet HashSe ...

  8. angular6 render2 & viewContentRef实践

    angular 渲染层 angular一个跨平台的框架不仅仅针对的浏览器这一个平台 ElementRef 与 TemplateRef 简单的理解: ElemnetRef : 例如一个<span& ...

  9. Linux下新建一个站点

    Apache+nagix使用Lnmpa创建一个新的站点 我们在部署服务器的时候通常会遇到需要分域名和分应用部署,那么如何通过Apache+nagix创建一个新的站点服务呢 LNMPA这种架构有什么优势 ...

  10. (转载) 车牌识别EasyPR--开发详解

    车牌识别EasyPR--开发详解 http://blog.csdn.net/liuuze5/article/details/46290455 源码GitHub:https://github.com/l ...