📄 samlauthfilter.java
字号:
package samlsso.servlet;
import java.io.IOException;
import java.util.Enumeration;
import javax.security.auth.login.LoginException;
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.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
import weblogic.servlet.security.ServletAuthentication;
/**
*
* @author maxq
* @version 0.9
*/
public final class SAMLAuthFilter implements Filter {
/**
*
*/
private String redirectURL;
/**
*
*/
private static String token_type= "SAML.Assertion";
/**
*
*/
private String realm= "myrealm";
/**
*
*/
public SAMLAuthFilter() {
super();
}
/*
* (non-Javadoc)
* @see javax.servlet.Filter#init(javax.servlet.FilterConfig)
*/
public void init( FilterConfig config) throws ServletException {
redirectURL= config.getInitParameter( "redirectURL");
String _token_type= config.getInitParameter( "token-type");
if ( _token_type!= null && _token_type.length()!= 0) {
token_type= config.getInitParameter( "token-type");
}
String _realm= config.getInitParameter( "realm-name");
if ( _realm!= null && _realm.length()!= 0) {
realm= _realm;
}
}
/*
* (non-Javadoc)
* @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain)
*/
public void doFilter( ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request= (HttpServletRequest)req;
HttpServletResponse response= (HttpServletResponse)res;
if ( request.getRemoteUser()!= null) {
chain.doFilter( req, res);
return;
}
String token= request.getParameter( token_type);
if ( token== null) {
String requrl= request.getRequestURL().toString();
String url= redirectURL.indexOf('?')!= -1 ?
redirectURL+ "&ssotarget=" + requrl: redirectURL+ "?ssotarget=" + requrl;
response.sendRedirect( response.encodeRedirectURL( url));
}else {
try {
HttpServletRequest wrappedRequest= wrapRequest( request, token);
int result= ServletAuthentication.assertIdentity( wrappedRequest, response, realm);
chain.doFilter( request, response);
}catch ( LoginException ex) {
throw new ServletException( ex);
}
}
}
/*
* (non-Javadoc)
* @see javax.servlet.Filter#destroy()
*/
public void destroy() {
}
/**
*
* @return
*/
private HttpServletRequest wrapRequest( HttpServletRequest request, String token) {
final String mytoken= token;
return new HttpServletRequestWrapper( request) {
/*
* (non-Javadoc)
* @see javax.servlet.http.HttpServletRequest#getHeader(java.lang.String)
*/
public String getHeader( String name) {
return ( name.equalsIgnoreCase( token_type))? mytoken : super.getHeader( name);
}
/*
* (non-Javadoc)
* @see javax.servlet.http.HttpServletRequest#getHeaderNames()
*/
public Enumeration getHeaderNames() {
if ( mytoken!= null)
return new MyEnumeration( super.getHeaderNames());
else
return super.getHeaderNames();
}
};
}
/**
*
* @author maxq
* @version 0.9
*/
private static class MyEnumeration implements Enumeration {
/**
*
*/
Enumeration enu;
/**
*
*/
boolean nomore;
/**
*
* @param enu
*/
public MyEnumeration( Enumeration enu) {
this.enu= enu;
this.nomore= false;
}
/*
* (non-Javadoc)
* @see java.util.Enumeration#hasMoreElements()
*/
public boolean hasMoreElements() {
boolean hasMore= enu.hasMoreElements();
return ( hasMore== false && nomore== false)?
nomore= true: hasMore;
}
/*
* (non-Javadoc)
* @see java.util.Enumeration#nextElement()
*/
public Object nextElement() {
if ( nomore) return token_type;
return enu.nextElement();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -