Reputation: 364
In my program any url in the form of /Controller/*
is redirected by my servlet mapping to Controller
class.
I tried to add a filter for authantication, if user is not logged in and path is not /Controller/RegForm
it's redirecting to /Controller/RegForm
.
Problem is because my servlet mapping redirects to /Controller
, filter always gets the /Controller
as path.
How can I use both filter and the servlet mapping ?
This is my web.xml
:
<filter>
<filter-name>AuthFilter</filter-name>
<filter-class>AuthFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>AuthFilter</filter-name>
<url-pattern>/Controller/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>Controller</servlet-name>
<servlet-class>Controller</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Controller</servlet-name>
<url-pattern>/Controller/*</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
my filter:
@WebFilter("/Controller/*")
public class AuthFilter implements Filter {
@Override
public void init(FilterConfig config) throws ServletException {
// If you have any <init-param> in web.xml, then you could get them
// here by config.getInitParameter("name") and assign it as field.
}
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
HttpSession session = request.getSession(false);
String path = ((HttpServletRequest) request).getServletPath();
if ((session != null && session.getAttribute("student") != null )||(excludeFromFilter(path))) {
chain.doFilter(req, res); // Log
}
else {
response.sendRedirect("/registration-war/Controller/RegForm"); // No logged-in user found, so redirect to login page.
}
}
private boolean excludeFromFilter(String path) {
if (path.equals("/Controller/RegForm")) {
return true; // add more page to exclude here
} else {
return false;
}
}
Upvotes: 1
Views: 189
Reputation: 418645
You use HttpServletRequest.getServletPath()
which returns the servlet URL which is (according to your servlet mapping) "/Controller"
.
You want the path info not the servlet path:
Returns any extra path information associated with the URL the client sent when it made this request. The extra path information follows the servlet path but precedes the query string and will start with a "/" character.
So for example this will return "/RegForm"
if your user requests the /Controller/RegForm
page.
String pathInfo = HttpServletRequest.getPathInfo();
Upvotes: 1