Apache Shiro——在web程序中使用Shiro

Apache Shiro特别对Web应用进行了支持

官方文档:传送门

用Shiro.ini当作配置文件做一个案例

1、新建Maven项目,pom文件依赖如下。

<dependencies>
     
    <!-- Apache Shiro 核心包  -->
    <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-core</artifactId>
            <version>1.4.0</version>
    </dependency>
    
    <!-- Apache Shiro Web 依赖包里面有一些过滤器 -->
    <dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-web</artifactId>
        <version>1.5.1</version>
    </dependency>
    
    <!-- Apache Shiro依赖的日志包,如果不加会报错  -->
    <dependency>
        <groupId>commons-logging</groupId>
        <artifactId>commons-logging</artifactId>
        <version>1.2</version>
    </dependency>    
    
    <!-- 引入servlet3.0使用注解配置servlet -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.1.0</version>
        <scope>provided</scope>
    </dependency>
        
  </dependencies>

2、新建一个Servlet,用于测试:IndexServlet,配置映射路径/hello

//访问路径事/hello
@WebServlet("/hello")
public class IndexServlet extends HttpServlet{
   
//重接goGet方法,用于获取get请求  @Override
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //获取get请求转发给post请求 doPost(req,resp); } @Override public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //向页面输出hallo! PrintWriter printWriter=resp.getWriter(); printWriter.write("hello!"); printWriter.flush(); } }

 3、配置web.xml

  <!-- 添加监听,此类要引入shiro-web依赖包,在程序启动的时候会加载。  -->
  <listener>
      <listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class>
  </listener>
  
  <!-- 添加过滤器 -->
  <filter>
      <filter-name>ShiroFilter</filter-name>
      <filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class>
  </filter>
  <filter-mapping>
      <filter-name>ShiroFilter</filter-name>
      <!-- 拦截所有请求 -->
      <url-pattern>/*</url-pattern>
  </filter-mapping>

1、监听器EnvironmentLoaderListener会在应用程序启动后加载/WEB-INF/shiro.ini或者classpath:shiro.ini下的配置文件(文件名只能是上面的)。

2、默认情况下,监听器会在程序加载的时候,根据获取的配置文件,初始化WebEnvironment对象,这里面包含了Shir框架必须的一些对象,包括最主要的SecurityManager对象。

3、如果向把配置文件到位置,和文件名自定义,可以使用<context-param>。

<context-param> 
    <param-name>shiroConfigLocations</param-name>
   <!-- 配置文件资源名,如下把配置文件放在了classpath下的static目录下,命名为myshiro.ini -->

    <param-value>classpath:static/myshiro.ini</param-value>
</context-param>

上面的配置的文件路径甚至可以是一个url地址,比如官方说的url:http://confighost.mycompany.com/myapp/shiro.ini;

扫描二维码关注公众号,回复: 9591614 查看本文章

4、配置文件也可以自定义,可以改成xml配置或者其他的配置文件。这里可以使用<context-param>类配置自定义的WebEnvironment。

<context-param>
      <param-name>shiroEnvironmentClass</param-name>

       <!--  自定义的WebEnvironment实现对象,写法参照org.apache.shiro.web.env.IniWebEnvironment -->
      <param-value>com.demo.MyWebEnvironment</param-value>
</context-param>

4、自定义过滤器。

public class MyFilter extends PathMatchingFilter{
    
    private String nickname;
    
    private String age;
    
    
    @Override
    public boolean preHandle(ServletRequest request, ServletResponse response) throws Exception {
        
        if(nickname != null) {
              System.out.println(nickname);
          }else {
              System.out.println("nickname 空的");  
          }
          if(age != null) {
              System.out.println(age);
          }else {
              System.out.println("age 空的");  
          }
          return true;
        
    }

    public String getNickname() {
        return nickname;
    }
    public void setNickname(String nickname) {
        this.nickname = nickname;
    }
    public String getAge() {
        return age;
    }
    public void setAge(String age) {
        this.age = age;
    }
    
}

上面的过滤器拦截被执行的时候会在控制台输出一些换,模拟一些操作。

还有连个变量,在配置过滤器的时候设置。

5、这里使用shrio.ini配置Shrio对象的创建,默认情况下,文件名为shiro.ini,必须放在WEB-INF目录下面,也可以自定义。

[main]
myfilter = com.demo.filter.MyFilter
myfilter.nickname = zhangsan
myfilter.age = 18

[users]
root = secret, admin
guest = guest, guest
presidentskroob = 12345, president
darkhelmet = ludicrousspeed, darklord, schwartz
lonestarr = vespa, goodguy, schwartz

[roles]
admin = *
schwartz = lightsaber:*
goodguy = winnebago:drive:eagle5


[urls]
#格式:拦截的路径=使用的过滤器
/hello/** = myfilter
/index.html = anon,roles[admin]

1、[mian]里面定义了过滤器的实例,和赋值(参照上个面的过滤器实现)。

2、[users]和[roles]两个是设置登陆和权限的,一般不怎么用。而且看字面的也好理解。官方:传送门

3、[urls]配置了过滤链,上面的例子中配置了三个个过滤器,当访问/hello下面的所有路径的时候执行自定义的myfilter(在上面有定义),当访问/index.html的时候,执行框架中提供的anon和roles。虽然anon和roles没写在[main]中,但这是框架默认提供的。anon是org.apache.shiro.web.filter.authc.AnonymousFilter的实例名还有很多默认过滤器请参考官方文档。

4、过滤器链还有很多多写法,处理上面那种一行行写,还可以写在一行。

filter1, filter2[optional_config2], ..., filterN[optional_configN]

5、中括号中的optional_config是一个配置,如果没有可以不加。

6、定义过滤器的时候是有先后顺序的,先定义的先执行。

 6、加入tomcat,启动。浏览器里输入/hello。

控制台输出:

>zhangsan
>18

 

猜你喜欢

转载自www.cnblogs.com/Eastry/p/12405364.html