繁体   English   中英

根据条件跳过Java过滤器

[英]Skip Java Filter based on Condition

我研究了如何在Java的过滤器链中跳过过滤器,并遵循了解决方案,但这没有帮助。

我的web.xml中有三个过滤器。 按此顺序排列Struts过滤器,自定义过滤器和IAM代理过滤器。 我想根据某些情况跳过IAM过滤器。 我无法控制IAM过滤器的外部代码安全性。 因此,当前端参数说用户类型为内部时,我需要调用IAM代理过滤器,否则我需要跳过此过滤器。

在web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="http://java.sun.com/xml/ns/javaee" 
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
id="WebApp_ID" 
version="2.5">
<display-name>App</display-name>
<!-- Struts2 Filter -->
<filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
    <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>*.action</url-pattern>
</filter-mapping>
 <!-- Custom App Filter for Handling Internal And External User-->
<filter>
   <filter-name>UserType</filter-name>
   <filter-class>com.App.web.filter.LoginFilter</filter-class>
</filter>
<filter-mapping>
   <filter-name>UserType</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

<!-- IAM Filter for Internal Users only-->
<filter>
   <filter-name>Agent</filter-name>
   <filter-class>com.sun.identity.agents.filter.AmAgentFilter</filter-class>
</filter>
<filter-mapping>
   <filter-name>Agent</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>   

<welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<listener>
    <listener-class>org.apache.tiles.web.startup.TilesListener</listener-class>
</listener>
<listener> 
    <listener-class>com.App.init.InitListener</listener-class>
</listener>
<context-param>
    <param-name>org.apache.tiles.impl.BasicTilesContainer.DEFINITIONS_CONFIG</param-name>
    <param-value>/WEB-INF/tiles.xml</param-value>
</context-param>

<!-- Web Service -->
<servlet>
    <servlet-name>EventManagementWS</servlet-name>
    <servlet-class>com.App.eventmanagement.ws.EventManagementWS</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>EventManagementWS</servlet-name>
    <url-pattern>/EventManagementWS</url-pattern>
</servlet-mapping>
<resource-ref>
       <res-ref-name>url/ConfigProperty</res-ref-name>
       <res-type>java.net.URL</res-type>
       <res-auth>Container</res-auth>
       <res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>

我正在使用RequestDispatcher#forward(),但在index.jsp页面输出中什么也没得到,只是空白页面。 CSS文件显示404错误。 当我使用Struts标签时,出现了错误

Uncaught exception created in one of the service methods of the servlet /index.jsp in application App. Exception created: The Struts dispatcher cannot be found.  This is usually caused by using Struts tags without the associated filter. Struts tags are only usable when the request has passed through its servlet filter, which initializes the Struts dispatcher needed for this tag.

所以我删除了S标签并使用了硬编码,但是现在我尝试包含的所有CSS都出现404错误。

我觉得前锋的表现不好。

Java筛选器代码:

package com.App.web.filter;

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.HttpSession;

import org.apache.commons.lang.StringUtils;

import com.App.constant.Constant;
import com.App.init.WIMSInitListener;
import com.App.log.WIMSMessageLogger;

public class LoginFilter implements Filter{

FilterConfig _filterConfig = null;
@Override
public void destroy(){
    // TODO Auto-generated method stub

}

@Override
public void doFilter(ServletRequest request, ServletResponse response, 
       FilterChain filterChain) throws IOException, ServletException{
    // Check IAM is enabled
    if (InitListener.isIAMEnabled()){
        HttpSession session = httpRequest.getSession();
        String userType = (String) session.getAttribute(Constant.USER_TYPE);
        if(userType == null || "".equals(userType)){
            MessageLogger.putMessageLog("User type is null : First Request" + userType, getClass());
            userType = request.getParameter(Constant.USER_TYPE);
            session.setAttribute(Constant.USER_TYPE, userType);
            request.getRequestDispatcher(((HttpServletRequest)request).getServletPath() + 
                    StringUtils.defaultString(((HttpServletRequest)request).getPathInfo()))
                        .forward(request, response);

        }
        if("external".equals(userType)){
            MessageLogger.putMessageLog("External User" + userType, getClass());
            request.getRequestDispatcher(((HttpServletRequest)request).getServletPath() + 
                    StringUtils.defaultString(((HttpServletRequest)request).getPathInfo()))
                        .forward(request, response);

        }
        else if("internal".equals(userType)){
            MessageLogger.putMessageLog("Internal User" + userType, getClass());
            //IAM Filter com.sun.identity.agents.filter.AmAgentFilter
            filterChain.doFilter(request, response);
        }
   }
   //Its always External User
   else{
       MessageLogger.putMessageLog("User IAM Not Enabled", getClass());
       request.getRequestDispatcher(((HttpServletRequest)request).getServletPath() + 
               StringUtils.defaultString(((HttpServletRequest)request).getPathInfo()) )
                      .forward(request, response);

   }
}

@Override
public void init(FilterConfig filterConfig) throws ServletException{
    this._filterConfig = filterConfig;
} 
}

的index.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01     Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>App</title>
<link rel="stylesheet" type="text/css" media="screen"
href="/App/css/common.css" />
<link rel="stylesheet" type="text/css" media="screen"
href="/App/css/rcorp.css" />
<link rel="stylesheet" type="text/css" media="all"
href="/App/css/style.css" />
<link rel="stylesheet" type="text/css" media="all"
href="/App/css/rcorp.css" />
<link rel="stylesheet" type="text/css" media="all"
href="/App/css/default.css" />
<script type="text/javascript">
function selectUserType(){
var frm = document.forms["UserTypeForm"];
if(document.getElementById("userTypeInternal").checked){
    //frm.action='<s:url action="loginAction.action?usertype=internal" namespace="" />';
    frm.action='/App/loginAction.action?usertype=internal';
}
else{
    //frm.action='<s:url action="loginAction.action?usertype=external" namespace="" />';
    frm.action='/App/loginAction.action?usertype=external';
}   
frm.target='_parent';
frm.submit();
}
function checkUserType(){   
//var userType = '<s:property value="#session.usertype" />';
var userType = '<%= session.getAttribute("usertype") %>';
if(userType == 'internal'){
    //frm.action='<s:url action="loginAction.action?usertype=internal" namespace="" />';
    frm.action='/App/loginAction.action?usertype=internal';
    frm.target='_parent';
    frm.submit();
}
else if(userType == 'external'){
    //frm.action='<s:url action="loginAction.action?usertype=external" namespace="" />';
    frm.action='/App/loginAction.action?usertype=external';
    frm.target='_parent';
    frm.submit();
}
}
</script>
</head>
<body onload="javascript:checkUserType();">
<form method="POST" action="loginAction.action" name="UserTypeForm">
    <div id="display_option"
        style="DISPLAY: none; position: absolute; top: 40%; width: 100%;"
        align="center">
        <div class="rcorp-tbl">
            <div style="width: 340px;">
                <div style="border: 1px solid #6da6fe; padding: 5px;">
                    <table style="background-color: #f0f8ff;" cellspacing=2 border=0>
                        <tr>
                            <td class="t-cellsecnowrap">Select User type:</td>
                            <td>
                            <td class="t-cell">
                                <div id="wwgrp_systemType" class="wwgrp">
                                    <div id="wwctrl_systemType" class="wwctrl">
                                        <input type="radio" name="UserType" id="internal" value="internal" checked/>
                                            <label for="userTypeInternal">Internal User (Sydney Trains Users)</label>&nbsp; 
                                        <input type="radio" name="userType" id="external" value="external"/>
                                            <label for="userTypeExternal">External User</label>&nbsp;&nbsp;&nbsp;&nbsp;
                                        <input type="button" name="applyBtn" id="applyBtn" class="btn" value="Go" title="Go" onclick="javascript:selectUserType();"/>
                                    </div>
                                </div>
                            </td>
                        </tr>
                    </table>
                </div>
            </div>
        </div>
    </div>
</form>
</body>
</html>

与其尝试在LoginFilter进行控制, LoginFilter创建一个扩展com.sun.identity.agents.filter.AmAgentFilter的新类,并在web.xml配置。 您的课程如下所示:

public class CustomFilter extends AmAgentFilter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        super.init(filterConfig);
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        if (InitListener.isIAMEnabled()) {
            HttpSession session = httpRequest.getSession();
            String userType = (String) session.getAttribute(Constant.USER_TYPE);
            if ("internal".equals(userType)) {
                super.doFilter(servletRequest, servletResponse, filterChain);
            }
        }
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {
        super.destroy();
    }
}

如果满足if块中的条件,则super.doFilter()调用将仅在AmAgentFilter执行操作。 否则,我们将忽略该过滤器,然后转到链中的下一个过滤器。

您可以在web.xml中而不是 AmAgentFilter配置此过滤器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM