zoukankan      html  css  js  c++  java
  • Filter过滤器简单应用( 接口访问控制 )

    一、描述

          在提供安卓、IOS客户端接口时,可以在登陆接口分配Session给客户端,用于判断其他接口是否是合法访问,以避免将所有的接口都暴露在web中可以由路径直接访问。但是最近的一个项目中的移动接口并没有给客户端分配Session,所以所有的接口都可以通过路径直接访问,这种方式会存在一定的风险性,只能通过接口对参数进行更精确的验证。一般情况下为方便管理会将所有接口单独放到WebRoot下单独一个文件夹目录下如WebRoot/appreq。改目录下的接口可直接被访问,如:http://localhost:8080/WebTest/appreq/agreement.jsp ;所以有必要对appreq目录下的jsp做访问限制。因此想到可以用Filter过滤器来实现对请求的过滤。关于过滤器的学习和使用可以查看园内这个博客,写的很详细:http://www.cnblogs.com/xdp-gacl/p/3948353.html

    二、实现

    a) 新建一个实现Filter接口的类,并实现接口定义的方法,其中doFilter()方法中就是你定义的这个过滤器里要实现的功能,代码如下:

     1 package com.app.util;
     2 
     3 import java.io.IOException;
     4 import java.io.PrintWriter;
     5 import java.util.HashMap;
     6 import java.util.Map;
     7 
     8 import javax.servlet.Filter;
     9 import javax.servlet.FilterChain;
    10 import javax.servlet.FilterConfig;
    11 import javax.servlet.ServletException;
    12 import javax.servlet.ServletRequest;
    13 import javax.servlet.ServletResponse;
    14 import javax.servlet.http.HttpServletRequest;
    15 import javax.servlet.http.HttpServletResponse;
    16 
    17 public class AppRequestFilter implements Filter{
    18 
    19     @Override
    20     public void destroy() {
    21         // TODO Auto-generated method stub
    22         
    23     }
    24 
    25     @Override
    26     public void doFilter(ServletRequest req, ServletResponse resp,
    27             FilterChain chain) throws IOException, ServletException {
    28         // TODO Auto-generated method stub
    29         System.out.println(" filter begin ");
    30         req.setCharacterEncoding("UTF-8");
    31         resp.setContentType("text/html;charset=UTF-8");
    32         HttpServletRequest request = (HttpServletRequest)req;
    33         HttpServletResponse response = (HttpServletResponse)resp;
    34         Object userid = request.getSession().getAttribute("current_user_id");
    35         if (userid == null) {
    36             //定义返回信息
    37             Map<String,Object> map = new HashMap<String,Object>();
    38             map.put("status", -1);
    39             map.put("data", null);
    40             map.put("msg", "you not login the system... can't request resource !");
    41             PrintWriter writer = response.getWriter();  
    42             //这里使用fastjson.jar返回JSON数据;
    43             writer.print( com.alibaba.fastjson.JSONArray.toJSONString(map));  
    44             writer.flush();  
    45             writer.close(); 
    46         }else{
    47             chain.doFilter(req, resp);
    48         }
    49         System.out.println(" filter end ");
    50     }
    51 
    52     @Override
    53     public void init(FilterConfig arg0) throws ServletException {
    54         // TODO Auto-generated method stub
    55         
    56     }
    57 
    58 }

    b) 上面就将过滤器建好了,现在只要在web.xml中配置上去或者叫注册,这个过滤器就可以发挥作用了。

    1   <filter>
    2     <filter-name>AppRequest</filter-name>
    3     <filter-class>com.app.util.AppRequestFilter</filter-class>
    4   </filter>
    5   <filter-mapping>
    6     <filter-name>AppRequest</filter-name>
    7     <url-pattern>/appinter/*</url-pattern>
    8   </filter-mapping>

    c) 致此,appinter下的接口就多了一层保护,没有登录获取session的话就会直接返回JSON提示信息让客户端处理:JSON返回实例如:{"msg":"you not login the system... can't request resource !","status":-1} 。

    补充:

    a) 为了让接口尽量规范,所以JSON返回格式要规定,至少三项:status状态码、msg状态信息、data数据,分别是String/String/Object类型;但是上面的JSON结果为什么没有data字段了呢,是因为用的fastjson.jar这个jar包的原因,因为这个jar包会自动把null值的字段过滤掉不显示,这一点安卓客户端解析每次都要判断会比较麻烦,实际使用可以考虑用其他JSON工具。

    b) 登陆的时候如何分配Session给客户端,如果是用struts可以用这个得到Session:

    Map session=ActionContext.getContext().getSession(); 然后往里面添上验证的信息也就是session.put("current_user_id", au.getId()),然后将session返回给客户端。

     以上内容,记以温查。

        

    边系鞋带边思考人生.
  • 相关阅读:
    TreeList Linq
    MasterDetail Linq
    C# 事务处理
    设计模式——代理模式(Proxy Pattern)
    设计模式——装饰模式(Decorator Pattern)
    C# 调用WCF服务
    加密解密
    Effective C#高效编程(02:常量)
    切换城市功能
    DataPager控件使用
  • 原文地址:https://www.cnblogs.com/crazytrip/p/4923929.html
Copyright © 2011-2022 走看看