1 package common.http;
2
3 import usecase.auth.CurrentUser;
4
5 import javax.inject.Inject;
6 import javax.servlet.FilterChain;
7 import javax.servlet.ServletException;
8 import javax.servlet.annotation.WebFilter;
9 import javax.servlet.http.HttpFilter;
10 import javax.servlet.http.HttpServletRequest;
11 import javax.servlet.http.HttpServletResponse;
12 import java.io.IOException;
13 import java.net.URI;
14 import java.net.URISyntaxException;
15
16 @WebFilter("*")
17 class AliasFilter extends HttpFilter {
18 @Inject CurrentUser currentUser;
19
20 @Override
21 protected void doFilter(HttpServletRequest req, HttpServletResponse res, FilterChain chain) throws IOException, ServletException {
22 String requri;
23 try {
24 requri = new URI(req.getRequestURI())
25 .normalize()
26 .toString()
27 .substring(req.getContextPath().length() +1 );
28 } catch (URISyntaxException e) {
29 chain.doFilter(req, res);
30 return;
31 }
32 String[] splits = requri.split("/+");
33 switch(splits[0]){
34 case "me":{
35 if(currentUser.isLoggedIn()){
36 req.getRequestDispatcher("/user?name=" + currentUser.getUsername() + '&' + req.getQueryString())
37 .forward(req, res);
38 return;
39 } else {
40 res.sendError(HttpServletResponse.SC_UNAUTHORIZED);
41 return;
42 }
43 }
44 case "popular": {
45 req.getRequestDispatcher("/home?view=popular" + '&' + req.getQueryString()).forward(req, res);
46 return;
47 }
48 case "feed":{
49 req.getRequestDispatcher("/home?view=following" + '&' + req.getQueryString()).forward(req, res);
50 return;
51 }
52 case "s":{
53 if(splits.length >= 2) {
54 req.getRequestDispatcher("/s?section=" + splits[1] + '&' + req.getQueryString()).forward(req, res);
55 return;
56 }
57 break;
58 }
59 case "u": {
60 if (splits.length >= 2) {
61 req.getRequestDispatcher("/user?name=" + splits[1] + '&' + req.getQueryString()).forward(req, res);
62 return;
63 }
64 break;
65 }
66 case "post":{
67 if(splits.length >= 2){
68 req.getRequestDispatcher("/post?id=" + splits[1] + '&' + req.getQueryString()).forward(req, res);
69 return;
70 }
71 break;
72 }
73 }
74
75 chain.doFilter(req, res);
76 }
77 }