Shiro过滤器(1)-先从filter路径开始讲起

最近在写一个项目,用到了Shiro,Shiro中的过滤器引起了小编的兴趣,今天特地把原生的过滤器filter复习了一遍,给大家分享一下,下次再来说说Shiro中封装的过滤器,其实说白了,所有框架都是封装了原生的servlet,因为底层是不会变的。不同的在于别人是技术大牛,封装的牛逼,其实你自己也可以封装,但估计会bug很多。

代码中有些注释不是关于filter的,是和重定向/转发以及访问不安全资源有关的,小编思路横飞,写着写着就想到其他地方去了,这一篇文章应该是写的最长的一篇了,就当给大家发福利了。

先来看一下小编的demo结构图:

Shiro过滤器(1)-先从filter路径开始讲起

demo结构图

第一步、先看一下web.xml文件,Tomcat启动时就会加载并初始化过滤器。注意:过滤器的执行顺序和web.xml文件中顺序是一样的,从上往下依次执行。

Shiro过滤器(1)-先从filter路径开始讲起

web.xml文件

第二步、编码过滤器,解释在后面,先看代码。

Shiro过滤器(1)-先从filter路径开始讲起

编码过滤器

第三步、记录日志过滤器

Shiro过滤器(1)-先从filter路径开始讲起

日志过滤器

下面开始测试:

1)当我们启动Tomcat时,会发生什么事呢?来看一下日志。

Shiro过滤器(1)-先从filter路径开始讲起

启动tomcat

2)在地址栏中输入:http://localhost:8080/FilterTest/

Shiro过滤器(1)-先从filter路径开始讲起

index.jsp

在web.xml中默认访问首页是index.jsp。

Shiro过滤器(1)-先从filter路径开始讲起

index.jsp页面内容

此时过滤器工作流程是:

Shiro过滤器(1)-先从filter路径开始讲起

访问index.jsp时,过滤器的执行过程

从中我们可以看出,先执行了EncodingFilter中的doFilter()方法,然后在执行chain.doFilter(request, response);时,发现后面还有LogFilter()过滤器,就立刻跳转执行LogFilter中的doFilter()方法,然后在执行chain.doFilter(request, response);时,后面已经没有过滤器了,将本过滤器中的doFilter()方法执行完之后有跳回到EncodingFilter中的doFilter()的chain.doFilter(request, response);的下一行,有点类似于中断嵌套的意思,自行体会吧。

3)接着再看一个表单提交的例子

Shiro过滤器(1)-先从filter路径开始讲起

form表单

<!-- 定义一个测试用的servlet -->

<servlet>

<servlet-name>filterTest</servlet-name>

<servlet-class>cn.uestc.chengdu.servlet.FilterTestServlet</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>filterTest</servlet-name>

<url-pattern>/filterTest</url-pattern>

</servlet-mapping>

同样的,在地址栏输入:http://localhost:8080/FilterTest/filterTestForm.jsp,过滤器也会对其进行阻拦,这个和上一个是一样的,本质都是一次对服务器的访问。

Shiro过滤器(1)-先从filter路径开始讲起

filterTestForm.jsp

控制台打印的日志如下:

Shiro过滤器(1)-先从filter路径开始讲起

4)点击提交表单,此时与提交相关的servlet如下,先测试转发时过滤器的工作流程:

Shiro过滤器(1)-先从filter路径开始讲起

表单内容

Shiro过滤器(1)-先从filter路径开始讲起

FilterTestServlet转发

控制台日志如下:

Shiro过滤器(1)-先从filter路径开始讲起

Shiro过滤器(1)-先从filter路径开始讲起

success.jsp页面如下:

Shiro过滤器(1)-先从filter路径开始讲起

success.jsp页面

看到这里我们基本上就明白了:由于我们在web.xml文件中配置的是/*,表示过滤所有请求,所以每次都会经过过滤器,FilterTestServlet类中我们用的是第24行代码,也就是转发,现在换成用31行的重定向来试试会有什么效果。

将FilterTestServlet类改成如下:

Shiro过滤器(1)-先从filter路径开始讲起

再次提交表单,看一下日志会打印出什么内容:

Shiro过滤器(1)-先从filter路径开始讲起

Shiro过滤器(1)-先从filter路径开始讲起

很明显,地址栏发生了改变,日志内容也比上次多了很多,原因在于重定向是客户端重新向服务器发送请求,所以过滤器又会拦截一次。

5)下面小编就来说一下转发和重定向的问题。

请求:从客户端--->服务器(Servlet)过程称为请求。由客户端发出比如登录表单操作。

响应:从服务器---->客户端过程称为响应。服务器向登录表单做出相应结果(无论登录是否成功)。

转发是同次请求(由服务器在它自己内部请求下一个资源)。重定向是多次请求(由服务器重定向到客户端,由客户端请求下一个资源)。一句话总结:转发是由服务器发出请求,重定向是由客户端发出请求。

6)重定向和转发相对路径和绝对路径问题

注意:转发和重定向的URLString前有加 / 为绝对路径 反之为相对路径

1.我们这里通过表单请求指定的Url资源 action="filterTest" ,那么则表单生成的请求地址为:

http://localhost:8080/FilterTest/filterTest

2.在servlet处理请求之后重定向到下面指定资源

参数可以指定为相对路径或绝对路径或web应用程序。

①相对路径:response.sendRedirect("redirect.jsp")生成的地址:原来请求地址+参数生成完整的URL即:http://localhost:8080/FilterTest/redirect.jsp

这个已经验证了。

②绝对路径:response.sendRedirect("/AbsolutePath/absolutePath.jsp")生成的地址:web服务器本身地址+参数生成完整的URL 即:http://localhost:8080/AbsolutePath/absolutePath.jsp。很明显,这是不对的。

如图所示:

Shiro过滤器(1)-先从filter路径开始讲起

正解如下:

下面小编将为项目增加一个 AbsolutePath文件夹, 相应代码更改如下图所示:

Shiro过滤器(1)-先从filter路径开始讲起

项目目录结构

FilterTestServlet更改及日志如下:

Shiro过滤器(1)-先从filter路径开始讲起

跳转结果如下:

Shiro过滤器(1)-先从filter路径开始讲起

重定向

③其他web应用地址response.sendRedirect("http://www.baidu.com") 容器直接定向到该URL。

上述的结论小编都已经验证,没有问题哦!!!!!!

下面再说今天的最后一个问题,访问静态资源文件,在WEB-INF里的资源外界是无法访问的,由此可以知道,如果想用重定向肯定是不可能的,原因是重定向就是外界直接访问的意思,而只能有转发:也就是服务器内部自己访问。项目结构及相关代码如下:

Shiro过滤器(1)-先从filter路径开始讲起

Shiro过滤器(1)-先从filter路径开始讲起

Shiro过滤器(1)-先从filter路径开始讲起

运行结果:

Shiro过滤器(1)-先从filter路径开始讲起

大功告成了!今天就先说这么多吧,本来是只想聊聊过滤器的,结果啰嗦了这么多,如果你觉得小编的文章对你有用,请点赞支持一下!谢谢啦!

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
web.xml配置 因为我们是与spring进行集成的,而spring的基本就是web项目的xml文件。所以我们在web.xml中配置shiros的过滤拦截。正常情况下,我们需要将shirofilter配置在所有的filter前面,当然和encodingFilter这个filter是不区分前后的。因为两者互相不影响的。spring-shiro.xml 这里我们将来看看spring-shiro.xml的配置,这里我采取倒叙的方式讲解,我觉的倒叙更加的有助于我们理解代码。首我们还记得在web.xml中配置的那个filter吧,名字shiroFilter,对spring-shiro.xml配置文件就是通过这个filter展开的。首我们在web.xml配置的过滤器实际上是配置ShiroFilterFactoryBean,所以在这里需要将ShiroFilterFactoryBean定义为shiroFilter <!-- Shiro的核心安全接口,这个属性是必须的 --> <!-- 要求登录时的链接(可根据项目的URL进行替换),非必须的属性,默认会自动寻找Web工程根目录下的"/login.html"页面 --> <!-- 登录成功后要跳转的连接 --> <!-- 用户访问未对其授权的资源时,所显示的连接 --> <!-- 若想更明显的测试此属性可以修改它的值,如unauthor.jsp,然后用[玄玉]登录后访问/admin/listUser.jsp就看见浏览器会显示unauthor.jsp --> <!-- Shiro连接约束配置,即过滤链的定义 --> <!-- 此处可配合我的这篇文章来理解各个过滤连的作用http://blog.csdn.net/jadyer/article/details/12172839 --> <!-- 下面value值的第一个'/'代表的路径是相对于HttpServletRequest.getContextPath()的值来的 --> <!-- anon:它对应的过滤器里面是空的,什么都没做,这里.do和.jsp后面的*表示参数,比方说login.jsp?main这种 --> <!-- authc:该过滤器下的页面必须验证后才能访问,它是Shiro内置的一个拦截器org.apache.shiro.web.filter.authc.FormAuthenticationFilter --> /statics/**=anon /login.html=anon /sys/schedule.html=perms[sys:schedule:save] /sys/login=anon /captcha.jpg=anon /**=authc
### 回答1: 在 Spring Boot 中使用 shiro 配置自定义过滤器需要以下几个步骤: 1. 引入 shiro-spring-boot-starter 依赖: ``` <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring-boot-starter</artifactId> <version>1.7.1</version> </dependency> ``` 2. 创建自定义过滤器: ``` public class CustomFilter extends AccessControlFilter { @Override protected boolean isAccessAllowed(ServletRequest servletRequest, ServletResponse servletResponse, Object o) throws Exception { // 在这里实现自定义的过滤逻辑,返回 true 表示通过过滤器,返回 false 表示未通过过滤器 return true; } @Override protected boolean onAccessDenied(ServletRequest servletRequest, ServletResponse servletResponse) throws Exception { // 如果 isAccessAllowed 返回 false,则会进入到这里,可以在这里处理未通过过滤器的情况 return false; } } ``` 3. 配置 shiroFilterChainDefinition: ``` @Bean public ShiroFilterChainDefinition shiroFilterChainDefinition() { DefaultShiroFilterChainDefinition chainDefinition = new DefaultShiroFilterChainDefinition(); // 添加自定义过滤器,其中 key 是过滤器名称,value 是该过滤器对应的路径 chainDefinition.addPathDefinition("/custom/**", "custom"); return chainDefinition; } ``` 4. 配置自定义过滤器: ``` @Bean("custom") public CustomFilter customFilter() { return new CustomFilter(); } ``` 5. 配置 shiro 的注解支持: ``` @Bean public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(DefaultWebSecurityManager securityManager) { AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor(); advisor.setSecurityManager(securityManager); return advisor; } ``` 完成以上步骤后,就可以在 Spring Boot 中使用 shiro 配置自定义过滤器了。 ### 回答2: 在 Spring Boot 中使用 Shiro 配置自定义过滤器分为三个步骤。 第一步,创建自定义过滤器类。可以通过实现 ShiroFilter 接口来创建自定义过滤器。在自定义过滤器中需要实现过滤规则,并对请求进行相应的处理。 第二步,配置 Shiro 过滤器链。在 Spring Boot 的配置类中,通过创建 ShiroFilterFactoryBean 对象来配置 Shiro过滤器链。可以使用 ShiroFilterChainDefinitionMap 对象来配置过滤器链,然后将该对象设置给 ShiroFilterFactoryBean。 第三步,启用 Shiro 过滤器。在 Spring Boot 的配置类中,通过创建 DefaultFilterChainManager 对象,并将该对象设置给 ShiroFilterFactoryBean,启用自定义过滤器。 有了以上三步,就可以在 Spring Boot 中使用 Shiro 配置自定义过滤器了。可以通过在自定义过滤器中实现过滤规则来对请求进行拦截或处理,然后在 Shiro 过滤器链中配置该过滤器,最后启用该过滤器。这样就可以实现对请求的自定义过滤器处理。 值得注意的是,在使用 Shiro 进行自定义过滤器配置时,需要保证 Shiro 的配置文件中已经进行了相应的配置,包括认证和授权等相关配置。只有在正确配置的前提下,才能正确使用 Shiro 进行自定义过滤器的配置。 ### 回答3: 在Spring Boot中使用Shiro配置自定义过滤器通常需要以下几个步骤: 1. 引入Shiro和Spring Boot依赖。在pom.xml文件中添加Shiro和Spring Boot Starter依赖: ``` <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring-boot-starter</artifactId> <version>1.7.1</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> ``` 2. 创建自定义过滤器类。可以通过实现`javax.servlet.Filter`接口或者继承`org.apache.shiro.web.servlet.OncePerRequestFilter`类来创建自定义过滤器。例如,创建一个名为`CustomFilter`的自定义过滤器类: ``` public class CustomFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { // 过滤器逻辑处理 // ... filterChain.doFilter(request, response); } } ``` 3. 在Shiro配置类中注册自定义过滤器。创建一个Shiro配置类,并使用`@Configuration`注解标记为配置类。通过`@Bean`注解将自定义过滤器注册到Shiro过滤器链中。例如,在配置类`ShiroConfig`中注册`CustomFilter`: ``` @Configuration public class ShiroConfig { @Bean public FilterRegistrationBean<CustomFilter> customFilterRegistrationBean() { FilterRegistrationBean<CustomFilter> registrationBean = new FilterRegistrationBean<>(); registrationBean.setFilter(new CustomFilter()); registrationBean.setOrder(Ordered.HIGHEST_PRECEDENCE); // 过滤器执行顺序 registrationBean.addUrlPatterns("/*"); // 过滤器路径 return registrationBean; } } ``` 4. 配置Shiro的过滤规则。在Shiro配置文件中,可以设置自定义过滤器的拦截规则。例如,在`shiro.ini`配置文件中,设置自定义过滤器的拦截规则: ``` [urls] /** = customFilter // 对所有请求都使用自定义过滤器 ``` 通过以上步骤,在Spring Boot中使用Shiro配置自定义过滤器就可以实现对特定请求的拦截和处理。在`CustomFilter`类的`doFilterInternal`方法中编写自定义的过滤器逻辑,例如鉴权、权限验证等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值