前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >filter控制url访问

filter控制url访问

作者头像
the5fire
发布2019-02-28 10:27:04
1.4K0
发布2019-02-28 10:27:04
举报
文章被收录于专栏:Python程序员杂谈

在做B/S开发的时候,安全性是必须要考虑的问题。其中有一个问题就是url的访问控制,具体来说就是你不经过登录页面登录那么你就不能访问后面的管理页面,或者是会员进去之后才能看到的页面。 以前用C#开发ASP.NET项目的时候是在每一个页面后台代码的page_load事件中对session进行判断,if语句实现如果没有相应的session值就会跳转到login页面或者index页面。如果仅有十几个页面也就罢了,但是如果后台页面几百个呢?总不能每一个页面都写一个吧。那么在学习javaweb开发的时候有了一个很好的解决方案,那就是通过filter来解决。 这个Filter就像是web系统的一道防火墙,你要访问任何资源,都会经过它的许可才行。所以这个“防火墙”里面的规则设定尤其重要,其中一个就是对url的访问控制。 实现的基本原理就是:在实现Filter接口的类中判断当前访问的url,如果不是登录页面,那么就判断session是否为null,判断session里面指定的参数是否为null。这样就可以了。

实现代码: 建立一个SessionFilter.java类来实现javax.servlet.Filter接口:

.. code:: java

代码语言:javascript
复制
package com.util;


import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;


public class SessionFilter implements Filter {

    @Override
    public void destroy() {
        // TODO Auto-generated method stub

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest)request;
        HttpServletResponse res = (HttpServletResponse)response;
        HttpSession session = req.getSession();
        System.out.println(req.getRequestURI());//测试uri
        System.out.println(req.getRequestURL());//测试url

        String requestUri = req.getRequestURI().substring(req.getRequestURI().indexOf("/",1),req.getRequestURI().length());

        //如果不是登录页面
        if (!"/login.jsp".equalsIgnoreCase(requestUri)) {
            //如果没有登录
            if (session == null || session.getAttribute("user_info") == null) {
                res.sendRedirect(req.getContextPath() + "/login.jsp");
                return;
            }
        }

        //继续访问其他资源
        chain.doFilter(req, res);

    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
        // TODO Auto-generated method stub

    }


}

配置web.xml中的filter标签,是的每一个资源访问都会通过刚才建立的这个filter:

::

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:javaee="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <filter>
        <filter-name>SessionFilter</filter-name>
        <filter-class>com.util.SessionFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>SessionFilter</filter-name>
        <url-pattern>*.jsp</url-pattern>
    </filter-mapping>

    <filter-mapping>
        <filter-name>SessionFilter</filter-name>
        <url-pattern>/servlet/*</url-pattern>
    </filter-mapping>
</web-app>

建立两个页面login.jsp和admin.jsp: login.jsp:

::

代码语言:javascript
复制
<%@ page language="java" contentType="text/html; charset=GB18030"
    pageEncoding="GB18030"%>
<%@ page import="com.domain.*" %>
<%
    request.setCharacterEncoding("GB18030");
    String command = request.getParameter("command");
    Admin admin = new Admin();
    if ("login".equalsIgnoreCase(command)) {
        //下面这一句用来解决乱码
        String name=new String(request.getParameter("user_name").getBytes("ISO-8859-1"),"GB2312");
        out.println(name);
        admin.setUserName(request.getParameter("user_name").toString());
        session.setAttribute("user_info",name);
        response.sendRedirect("admin.jsp");
    }
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030">
<title>Insert title here</title>
</head>
<form action="login.jsp">
    <input type="hidden" name="command" value="login">
    输入用户名:<input type="text" name="user_name">
    <input type="submit" value="登录">
</form>
<body>

</body>
</html>

admin.jsp:

::

代码语言:javascript
复制
<%@ page language="java" contentType="text/html; charset=GB18030"
    pageEncoding="GB18030"%>
<%@ page import="com.domain.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030">
<title>Insert title here</title>
</head>
这里是管理面板,当前登录用户为:<%=(String)session.getAttribute("user_info") %>
<body>

</body>
</html>

最后说一下要注意其中session中的中文乱码问题。

—EOF—

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2011-01-06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档