⑴ 前端如何实现登录拦截
如一个购物商城, 当你浏览某个商品需要购买时, 点击 购买按钮 这时需要检测是否登录。
如果用户已经登录,则进入购买页,否则进入登录页面。
如一个后台管理系统, 如果不登录则不能访问任何页面。
有两种拦截方式 路由拦截 和 http拦截器
一、路由拦截
首先在定义路由的时候就需要多添加一个自定义字段 requireAuth,用于判断该路由的访问是否需要登录。如果用户已经登录,则顺利进入路由, 否则就进入登录页面。
定义完路由后,利用 vue-router 提供的钩子函数 beforeEach() 对路由进行判断。
每个钩子方法接收三个参数:
to : ( Route ) 即将要进入的目标 路由对象
from : ( Route ) 当前导航正要离开的路由
next : ( Function ) 一定要调用该方法来 resolve 这个钩子。执行效果依赖 next 方法的调用参数。
next() : 进行管道中燃迅的下一族正个钩子。如果全部钩子执行完了,则导航的状态就是 confirmed (确认的)。
next(false) : 中断当前的导航。如果浏览器的 URL 改变了(可能是用户手动或者浏览器后退按钮),那么 URL 地址会重置到 from 路由对应的地址。
next(‘/’) 或者 next({ path: ‘/’ }) : 跳转到一个不同的地址。当前的导航被中断,然后进行一个新的导航。
确保要调用 next 方法,否则钩子就不会被 resolved。
to.meta 中是我们自定义的数据,其中就包括我们刚刚定义的 requireAuth 字段。通过这个字段来判断该路由是否需要登录权限。需要的话,同时当前应用不存在token,则跳转到登录页面,进行登录。登录成功后跳转到目标路由。
二、http拦截器
路由拦截只是简单的前端路由控制,并不皮穗此能真正阻止用户访问需要登录权限的路由。还有一种情况便是:当前token失效了,但是token依然保存在本地。这时候你去访问需要登录权限的路由时,实际上应该让用户重新登录。
这时候就需要结合 http 拦截器 + 后端接口返回的http 状态码来判断。
axios 的拦截器可通过配置http response inteceptor,当后端接口返回401 Unauthorized(未授权),让用户重新登录。
如有不妥欢迎留言, 希望能帮助到你~
⑵ 微信一键登录—JWT生成token、登录拦截
1、扫码授权登陆获得用户信息后,生成jwt token。返回给客户端。
2、登录拦截器
第一步:编写拦截器
第二步:配置拦截器
第三步:controller编写
测试:
1、访问微信登录
2、扫码登录。用返回的拼数绝接的url访问微信开发平台
3、手机扫码登录
跳转到网络页面,这里页面是第一步access_page中棚贺设置的,用来回调。
https://www..com/?token=eyJhbGciOiJIUzI1NiJ9._kyMSwiZXhwIjoxNTMyODY0MDgxfQ.-XVg&head_img=http://thirdwx.qlogo.cn/mmopen/vi_32/kWfVluL7B8Qcdho27Q/132&name=%E5%A4%9C%E6%9C%88%E4%BF%A0
第四链毕派步:postman测试
不加token:
错误token:
正确token:
⑶ 怎样关闭浏览器的拦截功能
每个浏览器的操作方法都差不多,下面以360浏览器为例,具体方法如下:
1、首先打开360浏览器,可以看到在页面的右上角有一个“工具”选项,单击该选项。如下图所示:
(3)登录拦截器拦截背景图片扩展阅读:
拦截器可以说相当于是个过滤器:就是把 不想要的或不想显示的内容给过滤掉。拦截器可以抽象出一部分代码可以用来完善原来的action。同时可以减轻代码冗余,提高重用率。
比如在登入一个页面时,如果要求用户密码、权限等的验证,就可以用自定义的拦截器进行密码验证和权限限制。陆悔对符合的登入者才跳转到正确页面。这样如果有新增权限的话,不用在action里修改任何代码,直接在interceptor里修改就行了。
1、好处:拦截器也可以让你将通用的代码模块化并作为可重用的类。Struts2中的很多特性都是由拦截器来完成的。
2、作用:可以构局悉庆成拦截器栈,完成特定功能。比如日志记录、登录判断、权限检查等作用。
⑷ 使用springMVC的拦截器验证登录时,拦截器拦截了静态的资源该怎么解决
springmvc拦截器定义后,还需要在springmvc框架的配置文件中注册,同时设置拦截的url路径,即会造成对controller拦截的同时也对访问的js和css文件进行拦截,可以通过配置不拦截js和css,例子如下
js和css放在web应用的static目录下
<mvc:interceptors>
<mvc:interceptor>
<mvc:mappingpath="/**"/>
<mvc:exclude-mappingpath="/static/**"/>--设置不拦截static下资源
颂并<beanclass="cn.sxt.rbac.interceptor.LoginInterceptor"></bean>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mappingpath="/**"/>
闹樱空<mvc:exclude-mappingpath="/static/**"/>--设置不拦截static下资源
<beanclass="cn.sxt.rbac.interceptor.UrlInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
这样在拦截液瞎controller同时,不会对static里面的js、css或者其他静态图片资源进行拦截。
⑸ springmvc有哪些拦截器
1.DispatcherServlet
SpringMVC具有统一的入口DispatcherServlet,所有的请求都通过DispatcherServlet。
DispatcherServlet是前置控制器,配置在web.xml文件中的。拦截匹配的请求,Servlet拦截匹配规则要自已定义,把拦截下来的请求,依据某某规则分发到目标Controller来处理。 所以我们现在web.xml中加入以下配置:
[html]view plainprint?
<!--初始化DispatcherServlet时,该框架在web应用程序WEB-INF目录中寻找一个名为[servlet-名称]-servlet.xml的文件,
并在那里定义相关的Beans,重写在全局中定义的任何Beans-->
<servlet>
<servlet-name>springMybatis</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springMybatis</servlet-name>
<!--所有的的请陪碧求,都会被DispatcherServlet处理-->
<url-pattern>/</url-pattern>
</servlet-mapping>
2.静态资源不拦截
如果只配置拦截类似于*.do格式的url,则对静态资源的访问是没有问题的,但是如果配置拦截了所有的请求(如我们上面配置的“/”),就会造成js文件、css文件、图片文件等静态资源无法访问。
一般实现拦截器主要是为了权限管理,主要是拦截一些url请求,所以不对静态资源进行拦截。要过滤掉静态资源一般有两种方式,
第一种是采用<mvc:default-servlet-handler />,(一般Web应用服务器默认的Servlet名称是"default",所以这里我们激活Tomcat的defaultServlet来处理静态文件,在web.xml里配置如下代码即可:)
[html]view plainprint?
<!--该servlet为tomcat,jetty等容器提供,将芦告举静态资源映射从/改为/static/目录,如原来访问http://localhost/foo.css,现在http://localhost/static/foo.css-->
<!--不拦截静态文件-->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/js/*</url-pattern>
<url-pattern>/css/*</url-pattern>
<url-pattern>/images/*</url-pattern>
<url-pattern>/fonts/*</url-pattern>
</servlet-mapping>
Tomcat, Jetty, JBoss, and GlassFish 默认 Servlet的名字 -- "default"
Resin 默认 Servlet的名字 -- "resin-file"
WebLogic 默认 Servlet的名字 -- "FileServlet"
WebSphere 默认 Servlet的名字 -- "SimpleFileServlet"
如果你所有的Web应用服务器的默认Servlet名称不是"default",则需要通过default-servlet-name属性显示指定:
[html]view plainprint?
<mvc:default-servlet-handlerdefault-servlet-name="所使用的Web服务器默认使用的Servlet名称"/>
第友察二种是采用<mvc:resources />,在springmvc的配置文件中加入以下代码:
[html]view plainprint?
<mvc:resourcesmapping="/js/**"location="/static_resources/javascript/"/>
<mvc:resourcesmapping="/styles/**"location="/static_resources/css/"/>
<mvc:resourcesmapping="/images/**"location="/static_resources/images/"/>
3.自定义拦截器
SpringMVC的拦截器HandlerInterceptorAdapter对应提供了三个preHandle,postHandle,afterCompletion方法。preHandle在业务处理器处理请求之前被调用,
postHandle在业务处理器处理请求执行完成后,生成视图之前执行,afterCompletion在DispatcherServlet完全处理完请求后被调用,可用于清理资源等 。所以要想实现自己的权限管理逻辑,需要继承HandlerInterceptorAdapter并重写其三个方法。
首先在springmvc.xml中加入自己定义的拦截器我的实现逻辑CommonInterceptor,
[html]view plainprint?
<!--配置拦截器,多个拦截器,顺序执行-->
<mvc:interceptors>
<mvc:interceptor>
<!--匹配的是url路径,如果不配置或/**,将拦截所有的Controller-->
<mvc:mappingpath="/"/>
<mvc:mappingpath="/user/**"/>
<mvc:mappingpath="/test/**"/>
<beanclass="com.alibaba.interceptor.CommonInterceptor"></bean>
</mvc:interceptor>
<!--当设置多个拦截器时,先按顺序调用preHandle方法,然后逆序调用每个拦截器的postHandle和afterCompletion方法-->
</mvc:interceptors>
我的拦截逻辑是“在未登录前,任何访问url都跳转到login页面;登录成功后跳转至先前的url”,具体代码如下:
[java]view plainprint?
/**
*
*/
packagecom.alibaba.interceptor;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importorg.slf4j.Logger;
importorg.slf4j.LoggerFactory;
importorg.springframework.web.servlet.ModelAndView;
importorg.springframework.web.servlet.handler.HandlerInterceptorAdapter;
importcom.alibaba.util.RequestUtil;
/**
*@authortfj
*2014-8-1
*/
{
privatefinalLoggerlog=LoggerFactory.getLogger(CommonInterceptor.class);
publicstaticfinalStringLAST_PAGE="com.alibaba.lastPage";
/*
*利用正则映射到需要拦截的路径
privateStringmappingURL;
publicvoidsetMappingURL(StringmappingURL){
this.mappingURL=mappingURL;
}
*/
/**
*在业务处理器处理请求之前被调用
*如果返回false
*从当前的拦截器往回执行所有拦截器的afterCompletion(),再退出拦截器链
*如果返回true
*执行下一个拦截器,直到所有的拦截器都执行完毕
*再执行被拦截的Controller
*然后进入拦截器链,
*从最后一个拦截器往回执行所有的postHandle()
*接着再从最后一个拦截器往回执行所有的afterCompletion()
*/
@Override
publicbooleanpreHandle(HttpServletRequestrequest,
HttpServletResponseresponse,Objecthandler)throwsException{
if("GET".equalsIgnoreCase(request.getMethod())){
RequestUtil.saveRequest();
}
log.info("==============执行顺序:1、preHandle================");
StringrequestUri=request.getRequestURI();
StringcontextPath=request.getContextPath();
Stringurl=requestUri.substring(contextPath.length());
log.info("requestUri:"+requestUri);
log.info("contextPath:"+contextPath);
log.info("url:"+url);
Stringusername=(String)request.getSession().getAttribute("user");
if(username==null){
log.info("Interceptor:跳转到login页面!");
request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request,response);
returnfalse;
}else
returntrue;
}
/**
*在业务处理器处理请求执行完成后,生成视图之前执行的动作
*可在modelAndView中加入数据,比如当前时间
*/
@Override
publicvoidpostHandle(HttpServletRequestrequest,
HttpServletResponseresponse,Objecthandler,
ModelAndViewmodelAndView)throwsException{
log.info("==============执行顺序:2、postHandle================");
if(modelAndView!=null){//加入当前时间
modelAndView.addObject("var","测试postHandle");
}
}
/**
*在DispatcherServlet完全处理完请求后被调用,可用于清理资源等
*
*当有拦截器抛出异常时,会从当前拦截器往回执行所有的拦截器的afterCompletion()
*/
@Override
publicvoidafterCompletion(HttpServletRequestrequest,
HttpServletResponseresponse,Objecthandler,Exceptionex)
throwsException{
log.info("==============执行顺序:3、afterCompletion================");
}
}
注:上述代码里我写了一个RequestUtil,主要实现获取当前Request、Session对象,保存和加密页面,取出等功能。
至此,拦截器已经实现了,效果如图:
我直接访问/test/hello,会被拦截
⑹ SpringBoot:访问拦截器HandlerInterceptor的使用
完成
应用场景
1、日志记录,可以记录请求信息的日志,以便进行信息监控、信息统计等。
2、权限检查:如登陆检测,进入处理器检测是虚闷否登陆,如果没有直接返回到登陆页面。
3、性能监控:典型的是慢日志。
拦截器我想大家都并不陌生,最常用的登录拦截、或是权限校验、或是防重复提交、或是根据业务像12306去校验购票时间,总之可以去做很多的事情。
定义一个Interceptor 非常简单方式也有几种,我这里简单列举两种
1、类要实现Spring 的HandlerInterceptor 接口
2、类继承实现了HandlerInterceptor 接口的类,例如 已经提供的实现了HandlerInterceptor 接口的抽象类HandlerInterceptorAdapter
preHandle:在业务处理器处理请求之前被调用。预处理,可以进行编码、安全控制、权限校验等处理;
postHandle:在业务处理器处理请求执行完成后,生成视图之前执行。后处理(调用了Service并返回ModelAndView,但未进行页面渲染),有机会修改ModelAndView (这个博差返弯主就基本不怎么用了);
afterCompletion:在DispatcherServlet完全处理完请求后被调用,可用于清理资源等。返回处理(已经渲染了页面);
------------
这样在我们业务中比如要记录系统日志,日志肯定是在afterCompletion之后记录的,否则中途失败了,也记录了,那就扯淡了。一定是程序正常跑完后,我们记录下那些对数据库做个增删改的操作日志进数据库。所以我们只需要继承HandlerInterceptorAdapter,并重写afterCompletion一个方法即可,因为preHandle默认是true。
运行流程总结如下:
1、拦截器执行顺序是按照Spring配置文件中定义的顺序而定的。
2、会先按照顺序执行所有拦截器的preHandle方法,一直遇到return false为止,比如第二个preHandle方法是return false,则第三个以及以后所有拦截器都不会执行。若都是return true,则按顺序加载完preHandle方法。
3、然后执行主方法(自己的controller接口),若中间抛出异常,则跟return false效果一致,不会继续执行postHandle,只会倒序执行afterCompletion方法。
4、在主方法执行完业务逻辑(页面还未渲染数据)时,按倒序执行postHandle方法。若第三个拦截器的preHandle方法return false,则会执行第二个和第一个的postHandle方法和afterCompletion(postHandle都执行完才会执行这个,也就是页面渲染完数据后,执行after进行清理工作)方法。(postHandle和afterCompletion都是倒序执行)
WebMvcConfigurer配置类其实是Spring内部的一种配置方式,采用JavaBean的形式来代替传统的xml配置文件形式进行针对框架个性化定制,可以 自定义一些Handler,Interceptor,ViewResolver,MessageConverter 。基于java-based方式的spring mvc配置,需要创建一个 配置 类并实现 WebMvcConfigurer 接口;
在Spring Boot 1.5版本都是靠重写 WebMvcConfigurerAdapter 的方法来世埋添加自定义拦截器,消息转换器等。SpringBoot 2.0 后,该类被标记为@Deprecated(弃用)。官方推荐直接实现WebMvcConfigurer或者直接继承WebMvcConfigurationSupport,方式一 实现WebMvcConfigurer接口( 推荐),方式二继承WebMvcConfigurationSupport类
其中常用的方法:
以前写SpringMVC的时候,如果需要访问一个页面,必须要写Controller类,然后再写一个方法跳转到页面,感觉好麻烦,其实重写WebMvcConfigurer中的addViewControllers方法即可达到效果了
值的指出的是,在这里重写addViewControllers方法,并不会覆盖 WebMvcAutoConfiguration (Springboot自动配置)中的addViewControllers(在此方法中,Spring Boot将“/”映射至index.html),这也就意味着 自己的配置和Spring Boot的自动配置同时有效 ,这也是我们推荐添加自己的MVC配置的方式。
比如,我们想 自定义静态资源映射目录 的话,只需重写addResourceHandlers方法即可。
注:如果继承WebMvcConfigurationSupport类实现配置时必须要重写该方法,具体见其它文章
此时会注册一个默认的Handler:,这个Handler也是用来处理静态文件的,它会尝试映射/。当DispatcherServelt映射/时(/ 和/ 是有区别的),并且没有找到合适的Handler来处理请求时,就会交给 来处理。注意:这里的静态资源是放置在web根目录下,而非WEB-INF 下。
可能这里的描述有点不好懂(我自己也这么觉得),所以简单举个例子,例如:在webroot目录下有一个图片:1.png 我们知道Servelt规范中web根目录(webroot)下的文件可以直接访问的,但是由于DispatcherServlet配置了映射路径是:/ ,它几乎把所有的请求都拦截了,从而导致1.png 访问不到,这时注册一个 就可以解决这个问题。其实可以理解为DispatcherServlet破坏了Servlet的一个特性(根目录下的文件可以直接访问),是帮助回归这个特性的。
这个方法是用来 配置视图解析器 的,该方法的参数ViewResolverRegistry 是一个注册器,用来注册你想自定义的视图解析器等。ViewResolverRegistry 常用的几个方法:
⑺ spring mvc 拦截器登录超时怎么跳转到登录页面
<?xmlversion="1.0"encoding="UTF-8"?>
<beansxmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd"
default-autowire="byName">
<!--autoregisterProcessor-->
<context:annotation-config/>
<beanclass="org.mybatis.spring.mapper.MapperScannerConfigurer">
<propertyname="basePackage"value="com.anxin.msapweb.db.mybatis.mapper"/>
</bean>
<beanid="sqlSessionFactory"class="org.mybatis.spring.SqlSessionFactoryBean">
<propertyname="dataSource"ref="db2dataSource"/>
</bean>
<mvc:interceptors>
<mvc:interceptor>
<!--需拦截的地址-->
<!--一级目录-->
<mvc:mappingpath="/*.do"/>
<mvc:mappingpath="/*.ajax"/>
<mvc:mappingpath="/*.htm"纯悔/>
<!--二级目录-->
<mvc:mappingpath="/*/*.do"/>
<mvc:mappingpath="/*/*.ajax"/>
<mvc:mappingpath="/*/*.htm"/>
<!--需排除拦截的地址-->
<mvc:exclude-mappingpath="/login.htm"/>
<beanclass="com.anxin.msapweb.web.interceptor.SecurityInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
</beans>
- 注:不支持<mvc:mapping path="*.do"做洞正 />
packagecom.anxin.msapweb.web.interceptor;
importjavax.servlet.http.HttpServletRequest;颤老
importjavax.servlet.http.HttpServletResponse;
importjavax.servlet.http.HttpSession;
importorg.springframework.web.servlet.HandlerInterceptor;
importorg.springframework.web.servlet.ModelAndView;
importcom.anxin.msapweb.common.Config;
{
privatestaticfinalStringLOGIN_URL="/login.htm";
@Override
publicbooleanpreHandle(HttpServletRequestreq,HttpServletResponseres,Objecthandler)throwsException{
HttpSessionsession=req.getSession(true);
//从session里面获取用户名的信息
Objectobj=session.getAttribute(Config.Passport.SESSION_NAME_LOGIN_RESULT);
//判断如果没有取到用户信息,就跳转到登陆页面,提示用户进行登陆
if(obj==null||"".equals(obj.toString())){
res.sendRedirect(LOGIN_URL);
}
returntrue;
}
@Override
publicvoidpostHandle(HttpServletRequestreq,HttpServletResponseres,Objectarg2,ModelAndViewarg3)throwsException{
}
@Override
publicvoidafterCompletion(HttpServletRequestreq,HttpServletResponseres,Objectarg2,Exceptionarg3)throwsException{
}
}
Java代码